2011-04-19 36 views
9

TreeViewにバインドされたLayersのリストがあります。各インスタンスのリストは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> 

をしかし、これはまだのみ、階層の最初のレベルのためにそれをしません。各レイヤーにどのように指定できますか?エフェクトコレクション?

答えて

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 to(System.Collections.IList)の値としてnull参照が存在しないようにするonの値がIListでない場合(InvalidCastExceptionがあるはずです) –

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(); 
     } 
    } 
} 
関連する問題