Связывание CollectionViewSource в DataTemplate - PullRequest
12 голосов
/ 29 июля 2010

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); Целевым свойством является «Источник» (тип «Объект»)

Мне кажется, что он ищет 'FooList' в CollectionViewSource вместо объекта, привязанного к DataTemplate.

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

Ответы [ 3 ]

24 голосов
/ 07 июля 2011

Насколько я понимаю, 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 голосов
/ 07 января 2011

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

0 голосов
/ 14 октября 2010

Я думаю, вам нужно привязать к виду CollectionViewSource:

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