10

好吧,我很困惑。

ItemsSource如果我的控件具有类型的依赖属性IEnumerable并且用户将集合绑定到它我有什么对象DependencyPropertyChangedEventArgs.NewValue

据我所知CollectionView,它是为集合隐式创建的,我希望args.NewValue是 type ICollectionView

这个博客

当用户将 WPF 属性绑定到数据集合时,WPF 会自动创建一个视图来包装该集合,并将该属性绑定到视图,而不是原始集合。这种行为总是发生,并且独立于 CollectionViewSource。

但是调试器(VS 2012,.net v.4.0)显示我收到原始原始集合在NewValue. (BindsDirectlyToSource 未设置,默认为 false)
这怎么可能?!

我无法理解在这种情况下 WPF 控件如何支持排序、分组和过滤。
CollectionView 如何以及何时注入和使用?

4

1 回答 1

4

或许CollectionView中备注部分的以下摘录回答了您的问题:

在 WPF 应用程序中,所有集合都有一个关联的默认集合视图。绑定引擎不是直接使用集合,而是始终通过关联的视图访问集合。要获取默认视图,请使用 CollectionViewSource.GetDefaultView 方法。基于 CollectionView 的内部类是仅实现 IEnumerable 的集合的默认视图。ListCollectionView 是实现 IList 的集合的默认视图。BindingListCollectionView 是实现 IBindingListView 或 IBindingList 的集合的默认视图。

或者,您可以使用 CollectionViewSource 类以可扩展应用程序标记语言 (XAML) 创建集合的视图,然后将控件绑定到该视图。CollectionViewSource 类是 CollectionView 类的 XAML 表示形式。有关示例,请参阅如何:使用 XAML 中的视图对数据进行排序和分组。

因此,如果您没有显式绑定到 CollectionViewSource,则始终对原始集合(您在其中获得的内容)进行集合绑定,但始终通过默认视图完成NewValue对集合的访问(例如,按索引获取项目) 。因此,声明“将属性绑定到视图,而不是原始集合”并不完全正确。

快速测试显示,GetDefaultView为我绑定的 ObservableCollection返回一个System.Windows.Data.ListCollectionView

于 2012-12-19T10:16:56.293 回答