1

フィルタリングする必要のあるコレクションを表示する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'の有効な値ではありません」という例外がスローされます。

UserControlでDataContextChangedイベントを使用して、ListCollectionViewに手動でフィルタリングを追加できると考えましたが、それはネストされず、ListBox.ItemsSourceプロパティも手動で設定する必要があります。既存のビューを使用して、Filterプロパティを変更します。私がやりたいのは、CollectionViewSourceを使用して別のビューを作成し、xamlを挿入できるようにすることです。それは可能ですか?

UserControlでCollectionViewsだけでなく通常のコレクションも処理できるようにしたい。

4

1 に答える 1

1

これは同じではないかもしれませんが、私にとってはうまくいっています。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();
于 2011-08-09T14:44:59.657 に答える