wpf - 将非静态参数传递给 CollectionViewSource 中的过滤器
问题描述
在我的应用程序中,我有一个类似数据库的结构,其中数据库对象本身包含多个ObservableCollection<KeyValuePair<Guid, T>>
集合。s的Guid
作用类似于关系数据库中的主键,即它们在不同集合的对象(数据库中的“表”)之间提供 1:1 和 1:n 映射。
现在考虑将ObservableCollection<KeyValuePair<Guid, T>>
位于对象层次结构根部的ItemsControl
. 在 内部DataTemplate
,我想将另一个集合的子集绑定DependencyProperty
到a UserControl
,其中Guid
s 匹配第一个集合中每个对象携带的值。
正如 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 的问题:
上面的代码驻留在一个视图中,它有自己的视图模型作为数据上下文。在
CustomUserControl
中实例化的DataTemplate
也有自己的视图模型。我在上面尝试的是将过滤结果(它是SubsetCollection
基于包含在ItemControl
当前RootObjectCollection
元素中的主键指示符的子集)传递给CustomUserControl
对应的字段。所有
ObservableCollection
s 都驻留在名为 的对象中的周围视图的视图模型中Database
。此对象包含其中的几个ObservableCollections
,除其他外,RootObjectCollection
还有SubsetCollection
.
解决方案
但是,我需要动态地将类型参数传递
ObservableCollection<Guid>
给CollectionViewSource
.
CollectionViewSource.Filter
是一个事件,您不能将任何自定义参数传递给它。您将获得一个FilterEventArgs
对该项目的只读引用和一个Accepted
属性,您可以设置该属性以指示是否在过滤集中包含该项目,但仅此而已。
您也许可以考虑创建一个扩展CollectionViewSource
并添加您自己的自定义依赖项属性的类。这应该使您能够绑定到源属性,例如SelectedKeys
. 然后,您可以通过在事件处理程序中转换sender
参数来检索依赖属性的值,例如:Filter
private void Cvs_Filter(object sender, FilterEventArgs e)
{
YourCustomCollectionViewSource cvs = sender as YourCustomCollectionViewSource;
//..
}
推荐阅读
- windows - 根据文件名上的前几个文本批量移动文件
- javascript - 引导轮播控件不更改活动类
- nginx - OpenShift / NGiNX 反向代理指南 - 传递到基于 SDN 的地址?
- reactjs - RefrenceError:属性“代理”不存在
- python - 在python中获取excel实例的语言
- javascript - 使用 Leaflet 实现“移动地图时搜索”
- python - Adding X-Y offsets to data points
- intellij-idea - 有没有办法将 VisualStudio 2017 键盘快捷键导入 IntelliJ?
- javascript - JQuery 添加选项以动态选择 7 种不同的选择
- sql-server - 是否会回滚此存储过程中的所有事务