2011-04-19 18 views
9

Her örnekte Effects listesinin bulunduğu TreeView numaralı bağlama bağlanmış Layers listesine sahibim. Onları harika çalışan bir HierarchicalDataTemplate ile gösteriyorum ama onları SortDescriptions kullanarak sıralamaya çalışıyorum.Xaml'de SortDescriptions kullanarak TreeView öğeleri nasıl sıralanır?

xaml in bunu nasıl bilmiyorum ama yapıyor bu öğelerin yalnızca ilk düzeyini değil, alt öğeleri sıralar:

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

ben .Color ilk sıralamak çalışıyorum, o zamana kadar .Name.

Herhangi bir fikrin var mı?

DÜZENLEME: Bu kodu ekledi:

<Window.Resources> 

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

</Window.Resources> 

Ama bu hala sadece hiyerarşinin ilk seviye için yapıyor. Her katman için bunu nasıl belirleyebilirim?

cevap

16

Alt öğeleri sıralamak için dönüştürücüyü kullanmanızı öneririm. Böyle şey:

<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> 

ve dönüştürücü:


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

Sadece çok küçük bir iyileşme değerini değiştirmek null reference excepti sahip olmaktan kaçınmak için System.Collections.IList (System.Collections.IList) değeri olarak değeri bir IList değilse (InvalidCastException olması gerekir) –

1

ben çok dönüştürücü kullanarak bulmak daha iyidir:

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