Подтвердить что ты не робот

Связывание коллекции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.

Итак... как мне получить это, чтобы посмотреть на правильный объект?

4b9b3361

Ответ 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

Я работал над этой проблемой, перемещая шаблон данных в пользовательский элемент управления.