首页 > 解决方案 > 将非静态参数传递给 CollectionViewSource 中的过滤器

问题描述

在我的应用程序中,我有一个类似数据库的结构,其中数据库对象本身包含多个ObservableCollection<KeyValuePair<Guid, T>>集合。s的Guid作用类似于关系数据库中的主键,即它们在不同集合的对象(数据库中的“表”)之间提供 1:1 和 1:n 映射。

现在考虑将ObservableCollection<KeyValuePair<Guid, T>>位于对象层次结构根部的ItemsControl. 在 内部DataTemplate,我想将另一个集合的子集绑定DependencyProperty到a UserControl,其中Guids 匹配第一个集合中每个对象携带的值。

正如 SO 上的大量答案所建议的那样,aCollectionViewSource是我需要的,即,

<ItemsControl ItemsSource="{Binding RootObjectCollection}>
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <local:CustomUserControl>
        <local:CustomUserControl.SubsetCollection>
          <Binding>
            <Binding.Source>
              <CollectionViewSource Source="{Binding DataContext.Database.SubsetCollection, RelativeSource={RelativeSource AncestorType=UserControl}}"
                                    Filter="someFilter"
                               ???? FilterParameters="{Binding SelectedKeys}" />
            </Binding.Source>
          </Binding>
        </local:CustomUserControl.SubsetCollection>
      </local:CustomUserControl>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

但是,我需要动态地将类型参数传递ObservableCollection<Guid>CollectionViewSource.

坦率地说,我迷路了,因为文档对此没有任何内容。我不敢相信我是第一个需要不绑定到文本字段的参数化动态过滤器的人……非常感谢任何提示!

2019-03-18 更新

上面的代码现在应该更清楚一点了。除此之外,还有一些背景信息以澄清@erotavlas 的问题:

标签: wpfxamldata-bindingwpf-controls

解决方案


但是,我需要动态地将类型参数传递ObservableCollection<Guid>CollectionViewSource.

CollectionViewSource.Filter是一个事件,您不能将任何自定义参数传递给它。您将获得一个FilterEventArgs对该项目的只读引用和一个Accepted属性,您可以设置该属性以指示是否在过滤集中包含该项目,但仅此而已。

您也许可以考虑创建一个扩展CollectionViewSource并添加您自己的自定义依赖项属性的类。这应该使您能够绑定到源属性,例如SelectedKeys. 然后,您可以通过在事件处理程序中转换sender参数来检索依赖属性的值,例如:Filter

private void Cvs_Filter(object sender, FilterEventArgs e)
{
    YourCustomCollectionViewSource cvs = sender as YourCustomCollectionViewSource;
    //..
}

推荐阅读