2011-04-19 12 views
9

Tengo una lista de Layers vinculada a un TreeView donde cada instancia tiene una lista de Effects. Los muestro a través de HierarchicalDataTemplate, que funciona muy bien, pero estoy tratando de ordenarlos usando SortDescriptions.¿Cómo ordenar elementos TreeView utilizando SortDescriptions en Xaml?

No sé cómo hacer esto en XAML, pero haciendo esto ordena sólo el primer nivel de artículos, no los sub elementos:

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

Estoy tratando de ordenarlos por primera vez por .Color, luego por .Name.

¿Alguna idea?

EDIT: He añadido este código:

<Window.Resources> 

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

</Window.Resources> 

Pero esto sólo lo hace para el primer nivel de la jerarquía. ¿Cómo puedo especificarlo para cada capa? ¿Efectos de recolección?

Respuesta

16

Yo sugeriría utilizar el convertidor para ordenar los elementos secundarios. Algo como esto:

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

y el convertidor:


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

Sólo una muy pequeña mejora, cambie el valor como valor de System.Collections.IList a (System.Collections.IList) para evitar tener una referencia nula excepti si el valor no es un IList (debe tener una InvalidCastException) –

1

encuentro utilizando un convertidor multinivel es mejor:

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