Связывание коллекцииViewSource в DataTemplate
'ContentTemplate' - это DataTemplate, который отображает объект, который имеет член FooList (ObservableCollection).
<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); target является "Source" (тип "Object" )
Мне кажется, что он ищет FooList в CollectionViewSource вместо объекта, привязанного к DataTemplate.
Итак... как мне получить это, чтобы посмотреть на правильный объект?
Ответы
Ответ 1
Как я понимаю, 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>
Ответ 2
Я думаю, вам нужно привязать к виду CollectionViewSource
:
<ListBox ItemsSource="{Binding Path=View, Source={StaticResource CVS}}">
Ответ 3
Я работал над этой проблемой, перемещая шаблон данных в пользовательский элемент управления.