2010-12-06 2 views
2

У меня есть silverlight 4 TreeView управление с иерархией данных. Я хочу, чтобы элементы на каждом уровне сортировались в алфавитном порядке, поэтому я использую CollectionViewSource, но на самом деле не волнует, как сортировка выполняется.Как сохранить текущий выбор в отсортированном treeview treeview?

CollectionViewSource, как представляется, наблюдает за событиями CollectionChanged, поэтому сортировка прекрасна, поскольку элементы добавляются и удаляются.

CollectionViewSource не отслеживает изменения сортируемого объекта, поэтому при изменении текста элемента сортировка не поддерживается. Вызов CollectionViewSource.View.Refresh() пересобирает список, но отбрасывает выбор. Как я могу сохранить выбор TreeViewбез потери и повторного выбора выбора?

Пример проект:

Описание:

Этого проект создает дерево одноуровневых элементов. Каждому элементу присваивается номер позиции, а числовой префикс, чтобы сортировка действительно делала что-то интересное. Кнопки добавят элемент, удаляют самый старый элемент и переименовывают самый старый элемент.

Создание образца:

  • Создать новый SilverLight приложение под названием "SortTest"
  • Добавить ссылку на System.Windows.Controls (для TreeView)
  • Update следующие файлы:

Поведение отметить:

  • Текущий выбор сохраняется, поскольку элементы добавляются и удаляются.
  • Текущий выбор теряется при переименовании объекта (когда Refresh() вызывается из OnRenameButtonClick()).
  • Если вызов Refresh() удален, выбор сохраняется при переименовании объекта, но список не сортируется повторно для учета изменения имени.

MainPage.xaml

<UserControl x:Class="SortTest.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"> 

    <UserControl.Resources> 
     <Style x:Key="expandedStyle" TargetType="sdk:TreeViewItem"> 
      <Setter Property="IsExpanded" Value="true" /> 
     </Style> 

     <sdk:HierarchicalDataTemplate x:Key="template"> 
      <TextBlock Text="{Binding Name}" /> 
     </sdk:HierarchicalDataTemplate> 
    </UserControl.Resources> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 

     <StackPanel Grid.Row="0" Orientation="Horizontal"> 
      <Button Click="OnAddButtonClick"> 
       <TextBlock Text="Add an item" /> 
      </Button> 
      <Button Click="OnRemoveButtonClick"> 
       <TextBlock Text="Remove lowest numbered item" /> 
      </Button> 
      <Button Click="OnRenameButtonClick"> 
       <TextBlock Text="Rename lowest numbered item" /> 
      </Button> 
     </StackPanel> 

     <sdk:TreeView Grid.Row="1" ItemsSource="{Binding Items}" ItemTemplate="{StaticResource template}" /> 

    </Grid> 
</UserControl> 

MainPage.xaml.cs

using System.Windows.Controls; 
using System.Collections.ObjectModel; 
using System.Windows; 
using System.Windows.Data; 
using System.ComponentModel; 
using System; 
using System.Collections.Specialized; 

namespace SortTest 
{ 
    public partial class MainPage : UserControl 
    { 
     private ObservableCollection<ItemViewModel> items = new ObservableCollection<ItemViewModel>(); 
     private CollectionViewSource sortedItems = new CollectionViewSource(); 
     private int itemNumber = 1; 

     public MainPage() 
     { 
      sortedItems.Source = items; 
      sortedItems.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); 

      DataContext = this; 
      InitializeComponent(); 
     } 

     public ICollectionView Items { get { return sortedItems.View; } } 

     private void OnAddButtonClick(object sender, RoutedEventArgs e) 
     { 
      ItemViewModel item = new ItemViewModel(); 
      item.Name = DateTime.Now.Millisecond.ToString("D3") + " Item #" + itemNumber; 
      itemNumber++; 
      items.Add(item); 
     } 

     private void OnRemoveButtonClick(object sender, RoutedEventArgs e) 
     { 
      if (items.Count > 0) 
      { 
       items.RemoveAt(0); 
      } 
     } 

     private void OnRenameButtonClick(object sender, RoutedEventArgs e) 
     { 
      if (items.Count > 0) 
      { 
       items[0].Name = DateTime.Now.Millisecond.ToString("D3") + items[0].Name.Substring(3); 
       sortedItems.View.Refresh(); 
      } 
     } 
    } 

    public class ItemViewModel : DependencyObject 
    { 
     public static DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(ItemViewModel), null); 
     public string Name 
     { 
      get { return GetValue(NameProperty) as string; } 
      set { SetValue(NameProperty, value); } 
     } 
    } 
} 

Спасибо!

ответ

0

сохраняйте выбранный элемент в изолированном хранилище и повторно выбирайте его после перезагрузки дерева.

+0

Добавить код, чтобы уточнить, что вы имеете в виду. – Jehof 2011-05-20 14:05:38

Смежные вопросы