我已经获得了一个控件,它允许从 codeproject 文章http://www.codeproject.com/KB/WPF/MultipleSelectionControl.aspx中选择多个项目。基本上它有 2 个列表框。一个从所有项目开始,当用户选择其中一些项目时,它们会移动到其他列表框。Control 为这两个列表定义了两个依赖属性,最初包含所有项目的属性是 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>
我正在尝试通过将 AvailableItems 绑定到 CollectionViewSource 并定义一个名为 Data_Filter 的过滤器函数来过滤它。AllItems 是一个 List 对象,它包含字符串。初始化控件时,会为 AllItems 中的每个项目调用 Data_Filter,并为每个项目正确设置 FilterEventArgs 的接受属性。但是,控件显示所有项目,而忽略 Data_Filter。在控件的实现中,ICollectionView 对象定义为:
this.AvailableItemsCollectionView =
CollectionViewSource.GetDefaultView(this.AvailableItems);
这让我怀疑控件正在跳过我的视图。我可以尝试在控件的实现中实现过滤,但这不是一个好的解决方案。有什么建议么?