Вложенная фильтрация с использованием CollectionViewSource в UserControl - PullRequest
1 голос
/ 09 августа 2011

У меня есть UserControl, который отображает некоторую коллекцию, которая должна быть отфильтрована, но коллекция, переданная в элемент управления, может быть отфильтрована в главном окне. Это выглядит так:

Window1.xaml

<Window x:Class="CollectionViewSourceTesting.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:CollectionViewSourceTesting="clr-namespace:CollectionViewSourceTesting"  
    Title="Window1" Height="300" Width="300">
<Window.Resources>
    <CollectionViewSource Source="{Binding Data}" x:Key="ItemsViewSource" Filter="CollectionViewSource_Filter" />
</Window.Resources>
<Grid>
    <CollectionViewSourceTesting:UserControl1 DataContext="{Binding Source={StaticResource ItemsViewSource}}" />
</Grid>
</Window>

UserControl1.xaml

<UserControl x:Class="CollectionViewSourceTesting.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         Height="300" Width="300">
<Grid>
    <Grid.Resources>
        <CollectionViewSource Source="{Binding}" x:Key="cvs" Filter="CollectionViewSource_Filter" />
    </Grid.Resources>
    <ListBox ItemsSource="{Binding Source={StaticResource cvs}}" />
</Grid>
</UserControl>

Это не работает, так как CollectionViewSource.Source не принимает ListCollectionView, он выдает исключение «System.Windows.Data.ListCollectionView» не является допустимым значением для свойства «Source». ".

Я подумал, что мог бы использовать событие DataContextChanged в UserControl, чтобы вручную добавить фильтрацию в ListCollectionView, но это не было бы вложением, и мне также нужно было бы установить свойство ListBox.ItemsSource вручную. Я бы использовал существующее представление и изменил бы свойство Filter. То, что я хочу сделать, это создать другое представление, используя CollectionViewSource, чтобы я мог вставить в xaml. Это возможно?

Я хочу, чтобы мой UserControl обрабатывал обычную коллекцию, а также CollectionViews.

1 Ответ

1 голос
/ 09 августа 2011

Возможно, это не то же самое, но это то, что работает для меня.Я сделал это так, потому что я не знал, что фильтр доступен для CollectionViewSource.Я использую триггер и жизнеспособность.Вы можете использовать конвертер для более продвинутой логики фильтра.Пользователь может изменить значение для триггера, и экран автоматически обновляется.MyGabeLib.Search.SelectedDoc.DocFields является ObservableCollection.

    <CollectionViewSource x:Key="curDocFields"
        Source="{Binding Path=MyGabeLib.Search.SelectedDoc.DocFields}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="FieldDefApplied.AppliedDisplayOrder" Direction="Ascending"/>
            <scm:SortDescription PropertyName="FieldDefApplied.FieldDef.DispName"/>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource> 

    <Style TargetType="ListViewItem">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=FieldDefApplied.AppliedDispDetail, Mode=OneWay}" Value="False" PresentationTraceSources.TraceLevel="High">
                <Setter Property="Visibility" Value="Collapsed"/>
            </DataTrigger>
        </Style.Triggers>
     </Style>

Я обнаружил, что если я изменяю значение и хочу обновить сортировку, мне нужно:

    CollectionViewSource.GetDefaultView(lbFields.ItemsSource).Refresh();
...