4

我正在尝试显示一个 Wpf Treeview,其中包含按 CollectionViewSource 排序的项目。

目前,除了在我的资源字典中使用此代码进行排序外,一切正常:

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

将 HierarchicalDataTemplate 更改为绑定到 CollectionViewSource 的语法是什么,而 CollectionViewSource 又从 Items 属性中提取?

我尝试了 Bea Stollnitz 博客上发布的代码的变体,但没有成功。我不知道如何设置 CollectionViewSource 的来源。

4

2 回答 2

7

好吧,我只想说我讨厌我提出的解决方案,但它确实有效。也许 WPF 大师会用更好的选择来启发我们俩。当然,如果您在视图后面使用 ViewModel,您可以简单地用 ViewModel 中的 CollectionView 包装模型的 Items 属性并完成它。

但这是另一个解决方案。基本上,您的 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

我按照你的建议做了,并用 ListCollectionView 包装了 Items 集合:

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