4

CollectionViewSource で並べ替えられたアイテムを含む Wpf Treeview を表示しようとしています。

現在、リソース ディクショナリで次のコードを使用した並べ替え以外はすべて機能しています。

<HierarchicalDataTemplate DataType="{x:Type books:Container}" ItemsSource="{Binding Path=Items}">
    <nav:ContainerControl />
</HierarchicalDataTemplate>

HierarchicalDataTemplate を変更して、Items プロパティからプルする CollectionViewSource にバインドするための構文は何ですか?

Bea Stollnitz のブログに投稿されたコードのバリエーションを試しましたが、成功しませんでした。CollectionViewSource のソースを設定する方法がわかりません。

4

2 に答える 2

7

提案されたソリューションが嫌いだとだけ言っておきますが、うまくいきます。おそらく、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;
    }
}
于 2010-01-19T03:01:16.033 に答える
0

あなたが提案したように、Items コレクションを ListCollectionView でラップしました。

private SortDescription _ItemsLcvSortDesc;
    private SortDescription ItemsLcvSortDesc
    {
        get
        {
            if (_ItemsLcvSortDesc == null)
                _ItemsLcvSortDesc = new SortDescription("SortOrder", ListSortDirection.Ascending);
            return _ItemsLcvSortDesc;
        }
    }

    private ListCollectionView _ItemsLcv;
    public ListCollectionView ItemsLcv
    {
        get
        {
            if (_ItemsLcv == null)
                _ItemsLcv = CollectionViewSource.GetDefaultView(Items) as ListCollectionView;
            _ItemsLcv.SortDescriptions.Add(ItemsLcvSortDesc);
            return _ItemsLcv;
        }
    }

何か見逃しましたか?

于 2010-01-20T06:29:46.957 に答える