2010-07-28 81 views
12

'ContentTemplate'是一个DataTemplate,它显示具有成员'FooList'(ObservableCollection)的对象。在DataTemplate中绑定CollectionViewSource

<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上。 BindingExpression:路径= FooList;的DataItem = NULL;目标元素是'CollectionViewSource'(HashCode = 52991666);目标属性是'源'(类型'对象')

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

那么......我怎么才能看到正确的对象呢?

+0

我遇到同样的问题。唯一我能想到的是,CVS不知道绑定的正确来源(你的'FooList'成员),它应该是这个级别的DataContext。有没有办法显式地将CVS上的源设置为DataTemplate的当前DataContext?再次,应该假设,但这不适合我们两个。 (你和我的唯一区别是你绑定到一个内部的ListBox,我绑定到一个HierarchicalDataTemplate的子项目以供在treeview中使用,但除此之外,你和我在同一条船上。 – MarqueIV 2010-10-20 16:45:34

+0

在我看来,它不应该有权访问资源部分中DataTemplate的数据。有谁知道这是否正确? – 2010-12-29 12:02:01

回答

0

我想你需要绑定到CollectionViewSource的观点:

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

刚刚发布了一个类似的问题。试过你明确指定'View'的解决方案这个路径,但它不起作用,而且,当你通常绑定到一个CVS时,你并没有为该路径指定'View',所以我不确定它会给出什么。确定为什么这段代码无法正常工作,所以也是如此。 – MarqueIV 2010-10-20 16:41:37

+0

你的代码不会工作CollectionViewSource是一个访问CollectionView的XAML代理,你不需要指定Path。 – 2015-11-18 09:45:03

0

我工作围绕这一问题通过移动数据模板到用户控制。

22

据我所知,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> 
+0

你太棒了!问题我遇到了,谢谢! – Scott 2012-04-25 20:39:31

+0

工程太棒了!谢谢! – 2014-06-18 17:48:28