2010-12-06 3 views
2

Ich habe eine silverlight 4 TreeView Kontrolle mit einer Hierarchie von Daten. Ich möchte, dass die Elemente in jeder Ebene alphabetisch sortiert sind, also verwende ich eine CollectionViewSource, aber eigentlich interessiert es mich nicht, wie die Sortierung durchgeführt wird.Wie kann ich die aktuelle Auswahl in einer sortierten silverlight Treeview pflegen?

Die CollectionViewSource scheint zu beobachten Ereignisse, so dass die Sortierung funktioniert gut, wie Elemente hinzugefügt und entfernt werden.

Die CollectionViewSource beobachtet keine Änderungen an der Eigenschaft, nach denen sortiert wird. Wenn sich der Text des Elements ändert, wird die Sortierung nicht beibehalten. Der Aufruf von CollectionViewSource.View.Refresh() sortiert die Liste neu, verwirft jedoch die Auswahl. Wie kann ich die TreeView Auswahl beibehalten, ohne die Auswahl zu verlieren und neu zu setzen?

Beispielprojekt:

Beschreibung:

Dieses Projekt schafft einen Single-Level-Baum der Elemente. Jeder Artikel erhält eine Artikelnummer und ein numerisches Präfix, damit die Sortierung tatsächlich etwas Interessantes bewirkt. Die Schaltflächen fügen ein Element hinzu, entfernen das älteste Element und benennen das älteste Element um.

Aufbau der Probe:

  • Erstellen Sie eine neue Silverlight-Anwendung mit dem Namen "SortTest"
  • einen Verweis auf System.Windows.Controls hinzufügen (für die treeview)
  • Aktualisieren Sie die folgenden Dateien:

Verhalten zu beachten:

  • Die aktuelle Auswahl wird beibehalten, wenn Elemente hinzugefügt und entfernt werden.
  • Die aktuelle Auswahl ist verloren, wenn ein Element umbenannt wird (wenn Refresh() von innerhalb OnRenameButtonClick() aufgerufen wird).
  • Wenn der Aufruf an Refresh() entfernt wird, wird die Auswahl beim Umbenennen eines Elements beibehalten, aber die Liste wird nicht neu sortiert, um die Namensänderung zu berücksichtigen.

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); } 
     } 
    } 
} 

Dank!

Antwort

0

Behalten Sie das ausgewählte Element in isolatedStorage bei und wählen Sie es erneut aus, nachdem Ihre Treeview neu geladen wurde.

+0

Fügen Sie einen Code hinzu, um zu verdeutlichen, was Sie meinen. – Jehof