wpf - 您可以在 DataTemplate 中使用 CollectionViewSource 吗?

标签 wpf data-binding datatemplate observablecollection collectionviewsource

是否可以在数据模板中显式使用 CollectionViewSource?通常我们会将 CollectionViewSource 放在模板旁边的资源中,但我们的模型不允许这样做,因为 collectionviewsource 的“源”是树中此级别的 DataContext 的属性,这意味着需要有一个实例在这个级别。将它放在资源的根目录中意味着只有一个实例。我们也不能简单地在外部级别上使用分组,因为这些项目在您处于层次结构的这么远之前不存在,并且并非所有 sibling 都具有此属性。所以从逻辑上讲,我们在 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 放在与数据模板相同的级别,因为每个模板都需要一个实例,因为每个模板都有自己的一组项目(尽管它们都将共享排序标准。)

最佳答案

好的......所以这不是我想要做的,但结果完全一样,甚至没有人评论,更不用说回答了,因此我把它作为一个。

我们需要这样做的最初原因是进行特定于节点的排序。虽然我们从未让 CollectionViewSource 工作,但我们确实设法将排序直接应用于节点。诀窍是在节点创建时进行,或者像我们正在做的那样,当节点扩展时(我们正在使用绑定(bind),所以我们不手动创建节点。)

请注意,我们的实际代码确实会跟踪我们是否已经将排序应用于相关节点,因此它不会在每个“扩展”事件上执行,但该代码与这个问题无关,所以为了简洁起见我省略了它。不过,您应该添加类似的内容。

无论如何,这是您如何进行每个节点排序的方法......

private void tvSymbols_Expanded(object sender, RoutedEventArgs e) {

    TreeViewItem node = e.OriginalSource as TreeViewItem;
    if(node==null) return;
    node.Items.SortDescriptions.Clear();
    node.Items.SortDescriptions.Add(new SortDescription("SomeField",      ListSortDirection.Ascending));
    node.Items.SortDescriptions.Add(new SortDescription("SomeOtherField", ListSortDirection.Descending));

}

当然,如果有人仍然弄清楚为什么原始问题的代码不起作用,请让我知道!

标记

关于wpf - 您可以在 DataTemplate 中使用 CollectionViewSource 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3979523/

相关文章:

c# - 如何在 Monogame 中全屏启动?

c# - 将参数传递给模板

json - com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException : UnrecognizedPropertyException and Unrecognized field

WPF 数据模板教程

c# - 呈现线程上发生未指定的错误。 (NotifyPartitionIsZombie)

WPF:如何将控件绑定(bind)到由多个依赖属性组成的公式?

c# - 将 PictureBox 与 LoadAsync 的 url 字符串绑定(bind)

c# - 有界数据更改后重新排序 WPF DataGrid

wpf - 修改 TabControl 的标题

wpf - 在 DataTemplates 中使用 TemplateBinding