【发布时间】:2019-03-16 23:49:14
【问题描述】:
在我的应用程序中,我有一个类似数据库的结构,其中数据库对象本身包含多个ObservableCollection<KeyValuePair<Guid, T>> 集合。 Guids 的作用类似于关系数据库中的主键,即它们在不同集合的对象(数据库中的“表”)之间提供 1:1 和 1:n 映射。
现在考虑将位于对象层次结构根部的ObservableCollection<KeyValuePair<Guid, T>> 绑定到ItemsControl。在DataTemplate 内部,我想将另一个集合的子集 绑定到UserControl 的DependencyProperty,其中Guids 匹配每个对象中的值第一次收藏进位。
作为 SO 建议的大量答案,CollectionViewSource 是我需要的,即,
<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 的问题:
上面的代码驻留在一个视图中,它有自己的视图模型作为数据上下文。在
DataTemplate中实例化的CustomUserControl也有自己的视图模型。我在上面尝试的是将过滤结果(它是SubsetCollection的子集,基于ItemControl的当前RootObjectCollection元素中包含的主键指示符)到CustomUserControl的相应字段。所有
ObservableCollections 都驻留在名为Database的对象中的周围视图的视图模型中。此对象包含其中几个ObservableCollections,其中包括RootObjectCollection和SubsetCollection。
【问题讨论】:
-
你的用户控件数据上下文是如何设置的?它是自己的视图模型还是继承父控件的数据上下文?每个 observablecollection 驻留在哪里?
-
@erotavlas,我已经更新了我的问题,以澄清你在问什么。请看一看,感谢您的支持!
标签: wpf xaml data-binding wpf-controls