2010-07-28 82 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