Come ordinare elementi TreeView utilizzando SortDescriptions in Xaml?

Ho un elenco di Layers associati a un TreeView cui ogni istanza ha un elenco di Effects . Li mostro tramite un HierarchicalDataTemplate che funziona alla grande ma sto cercando di ordinarli usando SortDescriptions .

Non so come farlo in xaml, ma facendo questo ordina solo il primo livello di elementi, non gli elementi secondari:

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

Sto cercando di ordinarli prima da .Color , poi da .Name .

Qualche idea?

EDIT: ho aggiunto questo codice:

         

Ma lo fa ancora solo per il primo livello di gerarchia. Come posso specificarlo per ogni layer. Seleziona la collezione?

Vorrei suggerire di utilizzare il convertitore per ordinare gli elementi secondari. Qualcosa come questo:

            

e convertitore:

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

Trovo che usare un multi converter sia migliore:

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