3

Я пытаюсь показать Wpf Treeview с элементами, отсортированными по CollectionViewSource.Bind a Wpf HierarchicalDataTemplate ItemsSource для CollectionViewSource в словаре?

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

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

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

Я пробовал варианты the code posted on Bea Stollnitz's blog без каких-либо успехов. Я не могу понять, как установить источник CollectionViewSource.

+0

Большой вопрос; собирался спросить того же самого. Благодаря! :-) –

ответ

5

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

Но вот еще одно решение. В принципе, ваш HierarchicalDataTemplate может оставаться как есть, кроме добавления конвертера в Binding. Я внедрил следующий конвертер и соответственно изменил 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

Спасибо за ваше решение. – awx

+0

Это решение вызывает одну незначительную проблему. Это предупреждение печатается в окне вывода Visual Studio несколько раз. «Ошибка System.Windows.Data: 4: Не удается найти источник для привязки со ссылкой« RelativeSource FindAncestor, AncestorType = «System.Windows.Controls.ItemsControl», AncestorLevel = '1' '. BindingExpression: Path = VerticalContentAlignment; DataItem = null; целевой элемент - «TreeViewItem» (Name = ''); target-свойство - «VerticalContentAlignment» (тип «VerticalAlignment») « Парень MS в группах MSDN говорит, что его можно смело игнорировать. – awx

+0

Эта ошибка звучит так, как будто она исходит из шаблона по умолчанию для TreeViewItem, а не привязки, с которой связан ваш вопрос. – Josh

0

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

ли я пропустить что-нибудь?

Смежные вопросы