0

我已经获得了一个控件,它允许从 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);

这让我怀疑控件正在跳过我的视图。我可以尝试在控件的实现中实现过滤,但这不是一个好的解决方案。有什么建议么?

4

1 回答 1

0

如果我正确阅读了您的代码片段,是的,您的收藏视图永远不会被使用;GetDefaultView不返回由 CollectionViewSource 显式创建的任何视图。

看起来需要重构控件以提供AvailableItemsSource允许您指定过滤集合视图的属性。然后,内部逻辑应在创建默认视图之前使用项目源。

更新

您可以尝试以下方法:

定义一个视图模型,该模型公开可以在视图中绑定的可用项目的集合。视图模型现在将负责过滤默认集合视图。您必须决定如何触发过滤,即通过命令或属性设置器等,但为了这个示例,我将在视图模型的构造函数中设置过滤器:

public class MyViewModel
{
  public IList MyAvailableItems {...}

  public MyViewModel()
  {
    var defaultView = CollectionViewSource.GetDefaultView(MyAvailableItems);
    defaultView.Filter = ...
  } 
}

这应该起作用的原因是它CollectionViewSource.GetDefaultView(...)总是返回相同的视图。因此,如果控件始终要求默认视图并且您的视图模型已向其添加了过滤器,则您应该获得所需的效果,而无需CollectionViewSource在 XAML 中显式创建。

于 2011-08-29T05:56:20.270 回答