【发布时间】:2011-04-28 03:06:15
【问题描述】:
是否可以在数据模板中显式使用 CollectionViewSource?通常我们会将 CollectionViewSource 放在模板旁边的资源中,但我们的模型不允许这样做,因为 collectionviewsource 的“源”是树中此级别的 DataContext 的属性,这意味着需要有一个实例在这个级别。将它放在资源的根目录中意味着只有一个实例。我们也不能简单地在外部级别上使用分组,因为这些项目在您处于层次结构的这么远之前不存在,并且并非所有兄弟姐妹都具有此属性。所以从逻辑上讲,我们在 DataTemplate 中实例化 CollectionViewSource(在本例中是 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
【问题讨论】:
-
真的很想在这里得到一个更适合原始方法的答案,或者即使 CollectionViewSource 在 DataTemplate 的 Resource 部分中。
-
实际上,我找到了一种我非常喜欢的更简单的方法......我只是将 CollectionViewSource 移动到转换器中,并使用它来设置返回值。现在我们只是在绑定时“更新”一个,因为这就是我们需要做的所有事情,但从技术上讲,我们可以根据需要返回我们有参考的预水合的。该死的漂亮,如果你问我并且像冠军一样工作!
-
我会调查的。谢谢。
标签: wpf data-binding datatemplate observablecollection collectionviewsource