在DataTemplate中绑定CollectionViewSource

13

'ContentTemplate' 是一个 DataTemplate,用于显示一个具有 'FooList' 成员(一个 ObservableCollection)的对象。

<DataTemplate x:Key="ContentTemplate">
    <ListBox ItemsSource="{Binding Path=FOO}">
        ...
    </ListBox>
</DataTemplate>

我需要使用CollectionViewSource对FooList进行过滤。这通常很简单,但在DataTemplate中似乎无法使绑定起作用。我尝试了以下内容:

<DataTemplate x:Key="ContentTemplate">
    <DataTemplate.Resources>
        <CollectionViewSource x:Key="CVS" Source="{Binding Path=FooList}" Filter="FooFilter"/>
    <DataTemplate.Resources>
    <ListBox ItemsSource="{Binding Source={StaticResource CVS}}">

我遇到的错误是:

System.Windows.Data Error: 2 : 找不到目标元素的主 FrameworkElement 或 FrameworkContentElement。BindingExpression:Path=FooList; DataItem=null; target element is 'CollectionViewSource' (HashCode=52991666); target property is 'Source' (type 'Object')

这听起来像是它在 CollectionViewSource 上查找 'FooList',而不是绑定到 DataTemplate 的对象。

那么...我该如何让它查找正确的对象呢?


我也遇到了同样的问题。唯一能想到的是,CVS 不知道绑定(你的 'FooList' 成员)的正确来源,这应该是此级别的 DataContext。有没有办法在 CVS 上显式设置源以匹配 DataTemplate 的当前 DataContext?再次强调,这应该是默认的,但对我们两个来说都不起作用。(你和我的唯一区别是,你绑定到一个内部 ListBox,而我绑定到 HierarchicalDataTemplate 的子项,用于树形视图。但除此之外,你和我处境相同。) - Mark A. Donohoe
据我所知,在资源部分内部是不应该访问DataTemplate的Data数据的。有人知道这是否正确吗? - Ingó Vals
3个回答

32

据我理解,DataTemplate作为指示向可视树中插入什么的指令,但本身并不成为可视树的一部分。在遇到您所描述的问题后,我才得出这个假设。我通过将CollectionViewSource附加到一个将成为可视树一部分的元素(在我的情况下是一个网格)的资源上来解决了这个问题。以下是能够正常工作的示例:

<DataTemplate DataType="{x:Type TypedLists:AssetModelListViewModel}">
    <Grid>
        <Grid.Resources>
            <CollectionViewSource x:Key="items"
                                  Source="{Binding}">
                <CollectionViewSource.SortDescriptions>
                    <scm:SortDescription PropertyName="AssetType.AssetCategory.Name" />
                    <scm:SortDescription PropertyName="AssetType.Name" />
                    <scm:SortDescription PropertyName="Manufacturer.Name" />
                </CollectionViewSource.SortDescriptions>
            </CollectionViewSource>
        </Grid.Resources>

        <ListView ItemsSource="{Binding Source={StaticResource items}}">

        </ListView>
    </Grid>
</DataTemplate>

你太棒了!这解决了我遇到的问题。谢谢! - Scott
非常好!谢谢你! - David Alan Condit

0

我通过将数据模板移动到用户控件中来解决了这个问题。


-1

我认为你需要绑定到CollectionViewSource的视图:

<ListBox ItemsSource="{Binding Path=View, Source={StaticResource CVS}}">

刚刚也发布了一个类似的问题。尝试了你明确指定路径中的“View”的解决方案,但它不起作用。此外,当您通常绑定到CVS时,无论如何都不会为路径指定“View”,因此我不确定那样做会有什么效果。不过,我仍然不确定为什么这段代码不起作用,所以还有这个问题。 - Mark A. Donohoe
你的代码无法工作。CollectionViewSource是一个XAML代理,用于访问CollectionView,你不需要指定路径。 - white.zaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接