Можно ли явно использовать CollectionViewSource внутри шаблона данных? Обычно мы помещаем CollectionViewSource в ресурсы вместе с шаблоном, но наша модель не позволяет этого, потому что «источник» collectionviewsource является свойством DataContext на этом уровне дерева, а это означает, что должен быть экземпляр на этом уровне. Размещение его в корне ресурсов означало бы, что был только один экземпляр. Мы также не можем просто использовать группировку на внешнем уровне, поскольку эти элементы не существуют, пока вы не окажетесь так далеко в иерархии, и не все братья и сестры даже имеют это свойство. Поэтому логически имеет смысл создавать экземпляр CollectionViewSource в DataTemplate (в данном случае HierarchicalDataTemplate, но это не имеет значения).
В частности, мы пытаемся разрешить определенную сортировку на этом конкретном уровне узла. Наш единственный другой выбор — сортировать в самой ViewModel, но это становится проблемой, поскольку мы используем ObservableCollections, которые сами по себе не поддерживают сортировку. На самом деле, во всех статьях, которые мы видели по этой теме, говорится, что вы должны использовать CollectionViewSource именно по этой причине, отсюда и этот вопрос.
Например, это работает…
<HierarchicalDataTemplate x:Key="CategoryTemplate"
ItemTemplate="{StaticResource TreeViewSymbolTemplate}"
ItemsSource="{Binding Symbols}">
<TextBlock Text="{Binding Name}" FontWeight="Bold" />
</HierarchicalDataTemplate>
Но это не…
<HierarchicalDataTemplate x:Key="CategoryTemplate"
ItemTemplate="{StaticResource TreeViewSymbolTemplate}">
<HierarchicalDataTemplate.ItemsSource>
<Binding>
<Binding.Source>
<CollectionViewSource Source="{Binding Symbols}" />
</Binding.Source>
</Binding>
</HierarchicalDataTemplate.ItemsSource>
<TextBlock Text="{Binding Name}" FontWeight="Bold" />
</HierarchicalDataTemplate>
Мне кажется, что это так, но это не так. Опять же, мы не можем поместить CollectionViewSource на тот же уровень, что и шаблон данных, поскольку для каждого шаблона должен быть один экземпляр, поскольку каждый из них имеет свой собственный набор элементов (хотя все они будут иметь общие критерии сортировки).
M