将Wpf HierarchicalDataTemplate ItemsSource绑定到字典中的CollectionViewSource?

时间:2010-01-19 01:56:15

标签: wpf data-binding hierarchicaldatatemplate collectionviewsource

我正在尝试使用CollectionViewSource显示的项目显示Wpf Treeview。

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

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

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

我尝试了the code posted on Bea Stollnitz's blog的变体而没有成功。我无法弄清楚如何设置CollectionViewSource的源。

2 个答案:

答案 0 :(得分:5)

好吧,我只想说我讨厌我提出的解决方案,但确实有效。也许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;
    }
}

答案 1 :(得分: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;
        }
    }

我错过了什么吗?