2010-07-28 2 views
12

'ContentTemplate'은 'FooList'(ObservableCollection) 멤버가있는 개체를 표시하는 DataTemplate입니다.DataTemplate 내 CollectionViewSource 바인딩

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

나는 그 FooList를 CollectionViewSource를 사용하여 필터링 할 수 있어야합니다. 이것은 대개 앞으로 간단하지만 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 : Path = FooList; DataItem = null; 대상 요소는 'CollectionViewSource'(HashCode = 52991666)입니다. 대상 속성이 'Source'(유형 '개체')입니다.

DataTemplate에 바인딩 된 개체 대신 CollectionViewSource에서 'FooList'를 찾고있는 것처럼 들리는데요.

그래서 ... 올바른 대상을 보려면 어떻게해야합니까?

+0

동일한 문제가 있습니다. 내가 생각할 수있는 것은 CVS가이 레벨에서 DataContext 여야하는 올바른 바인딩 소스 ('FooList'멤버)를 알지 못한다는 것입니다. 명시 적으로 CVS에있는 소스를 DataTemplate의 현재 DataContext로 설정하는 방법이 있습니까? 다시 말하지만, 이것이 우리 모두에게 효과가있는 것은 아닙니다. (당신과 내 사이의 유일한 차이점은 내부 ListBox에 바인딩한다는 것입니다. 나는 treeview에서 사용하기 위해 HierarchicalDataTemplate의 자식 항목에 바인딩하고 있습니다. 그러나 그 외에는, 당신과 나는 같은 보트에 있습니다. – MarqueIV

+0

그것은 내게 그것은 리소스 부분 안에있는 DataTemplate의 데이터에 접근 할 수있는 것으로 보이지 않습니다. 누구든지 그게 정확한지 알고 있습니까? –

답변

0

나는 당신이 CollectionViewSource의보기에 결합 할 필요가 있다고 생각 :

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

마찬가지로 비슷한 질문을 게시했습니다. '보기'를 명시 적으로 지정하려고 시도했습니다. 경로는 작동하지만 작동하지 않습니다. 또한 CVS에 일반적으로 바인드 할 때, 경로에 대해 '보기'를 지정하지 않아서 어떻게 될지 확신 할 수 없습니다. 이 코드가 작동하지 않는 이유는 무엇입니까? – MarqueIV

+0

코드가 작동하지 않습니다 CollectionViewSource는 CollectionView에 액세스하기위한 XAML 프록시이므로 경로를 지정할 필요가 없습니다 –

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

+0

훌륭한 작품! 고맙습니다! –