Привязать WPF HierarchicalDataTemplate ItemsSource к CollectionViewSource в словаре? - PullRequest
3 голосов
/ 19 января 2010

Я пытаюсь отобразить Wpf Treeview с элементами, отсортированными по CollectionViewSource.

В настоящее время все работает, кроме сортировки с использованием этого кода в моем словаре ресурсов:

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

Каков будет синтаксис для изменения HierarchicalDataTemplate для привязки к CollectionViewSource, который, в свою очередь, извлекает из свойства Items?

Я пробовал варианты кода, опубликованного в блоге Беа Столнниц , но безуспешно. Я не могу понять, как установить источник CollectionViewSource.

Ответы [ 2 ]

5 голосов
/ 19 января 2010

Хорошо, позвольте мне просто сказать, что я ненавижу предложенное решение, но оно работает.Возможно, гуру WPF просветит нас обоих лучшей альтернативой.Конечно, если вы используете ViewModel за своим представлением, вы можете просто обернуть свойство Items модели с CollectionView в ViewModel и покончить с этим.

Но вот другое решение.По сути, ваш 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;
    }
}
0 голосов
/ 20 января 2010

Я сделал, как вы предложили, и обернул коллекцию 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;
        }
    }

Я что-то пропустил?

...