【问题标题】:WPF - CollectionViewSource Filter Not WorkingWPF - CollectionViewSource 过滤器不工作
【发布时间】:2011-08-28 01:24:42
【问题描述】:

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

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

【问题讨论】:

    标签: .net wpf collectionviewsource


    【解决方案1】:

    如果我正确阅读了您的代码 sn-ps,是的,您的收藏视图从未被使用过; GetDefaultView 不返回任何由 CollectionViewSource 显式创建的视图。

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

    更新

    您可以尝试以下方法:

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

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

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

    【讨论】:

    • 我知道,但是如何通过对控制代码的最小更改来完成。我期待更详细的解决方案,只能通过检查我提供的链接中的控制代码来完成。
    • 根据您发布的代码,如果不更改控制代码似乎无法完成,因为原始程序员要求使用默认集合视图而没有其他选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多