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 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。绑定表达式:路径=FooList;数据项=空;目标元素是“CollectionViewSource”(HashCode=52991666);目标属性是“源”(类型“对象”)

在我看来,这听起来像是在 CollectionViewSource 上寻找“FooList”而不是绑定到 DataTemplate 的对象。

那么......我如何让这个看到正确的对象?

4

3 回答 3

31

据我了解,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>
于 2011-07-07T17:37:48.637 回答
0

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

于 2011-01-07T17:15:39.000 回答
-1

我认为您需要绑定到以下视图CollectionViewSource

<ListBox ItemsSource="{Binding Path=View, Source={StaticResource CVS}}">
于 2010-10-14T08:28:20.643 回答