2011-04-19 74 views
9

我有一個綁定到TreeViewLayers的列表,其中每個實例都有一個列表Effects。我通過HierarchicalDataTemplate向他們展示,這很好用,但我試圖用SortDescriptions對它們進行排序。如何在Xaml中使用SortDescriptions對TreeView項目進行排序?

我不知道如何在XAML這樣做,但這樣做只是排序項的第一級,而不是分項目:

ICollectionView view = CollectionViewSource.GetDefaultView (treeView1.ItemsSource); 
view.SortDescriptions.Add (new SortDescription ("Name", ListSortDirection.Ascending)); 

我想他們通過.Color先進行排序,然後通過.Name

任何想法?

編輯:我添加了這個代碼:

<Window.Resources> 

    <CollectionViewSource x:Key="SortedLayers" Source="{Binding AllLayers}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="Color" /> 
      <scm:SortDescription PropertyName="Name" /> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 

</Window.Resources> 

但是,這仍然只是做它的層次結構的第一層。我怎樣才能爲每個layer.Effects集合指定它?

回答

16

我會建議使用轉換器來排序子項目。 事情是這樣的:

<TreeView Name="treeCategories" Margin="5" ItemsSource="{Binding Source={StaticResource SortedLayers}}"> 
<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Effects, Converter={StaticResource myConverter}, ConverterParameter=EffectName}"> 
     <TextBlock Text="{Binding Path=LayerName}" /> 
     <HierarchicalDataTemplate.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=EffectName}" /> 
      </DataTemplate> 
     </HierarchicalDataTemplate.ItemTemplate> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 

和轉換器:


public class MyConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     System.Collections.IList collection = value as System.Collections.IList; 
     ListCollectionView view = new ListCollectionView(collection); 
     SortDescription sort = new SortDescription(parameter.ToString(), ListSortDirection.Ascending); 
     view.SortDescriptions.Add(sort); 

     return view; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 
} 
+0

只是一個非常小的改進,改變價值作爲System.Collections.IList爲(System.Collections.IList)值以避免具有空引用excepti如果值不是IList(你應該有一個InvalidCastException) – 2011-08-23 09:30:41

1

我發現使用多轉換器更好:

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.Globalization; 
using System.Windows.Data; 

namespace Converters 
{ 
    [ValueConversion(typeof(object[]), typeof(ListCollectionView))] 
    public class IListToListCollectionViewConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      var Length = values.Length; 
      if (Length >= 1 && Length < 3) 
      { 
       var IList = values[0] as IList; 

       var SortName = string.Empty; 
       if (Length > 1) 
        SortName = values[1].ToString(); 

       var SortDirection = ListSortDirection.Ascending; 
       if (Length > 2) 
        SortDirection = values[2] is ListSortDirection ? (ListSortDirection)values[2] : (values[2] is string ? (ListSortDirection)Enum.Parse(typeof(ListSortDirection), values[2].ToString()) : SortDirection); 

       var Result = new ListCollectionView(IList); 
       Result.SortDescriptions.Add(new SortDescription(SortName, SortDirection)); 
       return Result; 
      } 
      return null; 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 
相關問題