コードプロジェクトの記事http://www.codeproject.com/KB/WPF/MultipleSelectionControl.aspxから複数の項目を選択できるコントロールを取得しました。基本的に、2 つのリストボックスがあります。1つはすべてのアイテムから始まり、ユーザーがそれらのいくつかを選択すると、他のリストボックスに移動します。Control は、2 つのリストの 2 つの依存関係プロパティを定義します。最初にすべての項目を含むプロパティは AvailableItems です。コントロールの ControlTemplate で次のように使用されます。
<ListBox
Grid.Row="2"
Grid.Column="0"
SelectionMode="Extended"
x:Name="PART_AvailableListBox"
ItemsSource="{Binding AvailableItems}"
ItemTemplate="{TemplateBinding ObjectsTemplate}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="MouseDoubleClick" Handler="AvailableListBoxItem_DoubleClick" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
プロジェクトでコントロールを次のように使用します。
<Window.Resources>
<CollectionViewSource x:Key="multiSelectDataView" Source="{Binding ElementName=DocumentRoot, Path=AllItems}" Filter="Data_Filter" />
</Window.Resources>
<UI:MultiSelectControl
x:Name="multiSelect"
Style="{StaticResource MultiSelectControlStyle}"
CurrentTitle="Group Components"
AvailableTitle="All Components"
AvailableItems="{Binding Source={StaticResource multiSelectDataView}}"
CurrentItems="{Binding SelectedItems, Mode=TwoWay}">
<UI:MultiSelectControl.ObjectsTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" />
</DataTemplate>
</UI:MultiSelectControl.ObjectsTemplate>
</UI:MultiSelectControl>
CollectionViewSource にバインドし、Data_Filter というフィルター関数を定義して、AvailableItems をフィルター処理しようとしています。AllItems は List オブジェクトであり、文字列が含まれています。コントロールが初期化されると、Data_Filter が AllItems のすべてのアイテムに対して呼び出され、FilterEventArgs の受け入れられたプロパティが各アイテムに対して正しく設定されます。ただし、コントロールは Data_Filter を無視してすべてのアイテムを表示します。コントロールの実装では、ICollectionView オブジェクトは次のように定義されます。
this.AvailableItemsCollectionView =
CollectionViewSource.GetDefaultView(this.AvailableItems);
これにより、コントロールがビューをスキップしているのではないかと疑われます。コントロールの実装でフィルタリングを実装しようとすることはできますが、これは良い解決策ではありません。助言がありますか?