提案されたソリューションが嫌いだとだけ言っておきますが、うまくいきます。おそらく、WPF の第一人者が、より良い代替手段を教えてくれるでしょう。もちろん、ビューの背後で ViewModel を使用している場合は、モデルの Items プロパティを ViewModel の CollectionView でラップするだけで完了できます。
しかし、ここに別の解決策があります。基本的に、Binding に Converter を追加する場合を除いて、HierarchicalDataTemplate はそのまま使用できます。次のコンバーターを実装し、それに応じて XAML を変更しました。
<HierarchicalDataTemplate DataType="{x:Type books:Container}"
ItemsSource="{Binding Items, Converter={x:Static local:CollectionViewConverter.Instance}}">
<nav:ContainerControl />
</HierarchicalDataTemplate>
CollectionViewConverter.cs
public class CollectionViewConverter : IValueConverter
{
public CollectionViewConverter() {}
static CollectionViewConverter(){
Instance = new CollectionViewConverter();
}
public static CollectionViewConverter Instance {
get;
set;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var view = new ListCollectionView((System.Collections.IList)value);
view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
return view;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
// not really necessary could just throw notsupportedexception
var view = (CollectionView)value;
return view.SourceCollection;
}
}