在数据模板内明确使用CollectionViewSource是否可行?通常我们会将CollectionViewSource与模板放在资源中,但是我们的模型不允许这样做,因为CollectionViewSource的“源”是DataContext在树的此级别上的属性,这意味着需要在此级别上有一个实例。将其放在资源的根目录中将意味着只有一个实例。我们也不能简单地在外部级别上使用分组,因为这些项直到您到达这个层次才存在,并且并非所有同级甚至都具有此属性。因此,在DataTemplate(在这种情况下是HierarchicalDataTemplate,但这无关紧要)中实例化CollectionViewSource是合乎逻辑的。
似乎应该可以,但实际上不行。我们不能将CollectionViewSource放在与数据模板相同的级别上,因为每个模板都需要一个实例,因为每个模板都有自己的项目集(尽管它们将共享排序标准)。
具体来说,我们试图允许在此特定节点级别上进行特定排序。我们唯一的选择是在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放在与数据模板相同的级别上,因为每个模板都需要一个实例,因为每个模板都有自己的项目集(尽管它们将共享排序标准)。