好吧,我很困惑。
如果我的控件具有ItemsSource
类型的依赖属性IEnumerable
,并且用户将集合绑定到它DependencyPropertyChangedEventArgs.NewValue
中有哪个对象?
据我所知,CollectionView
是为集合隐式创建的,我希望args.NewValue
的类型为ICollectionView
。
来自this blog:
当用户将WPF属性绑定到数据集合WPF时 自动创建一个视图来包装集合,并绑定 属性到视图,而不是原始集合。总是这种行为 发生,并且独立于CollectionViewSource。
但调试器(VS 2012,.net v.4.0)向我显示我在NewValue
收到原始原始集合。 (BindsDirectlyToSource未设置,默认情况下等于false)
怎么会这样?!
我无法理解在这种情况下WPF控件如何支持排序,分组和过滤 CollectionView如何以及何时注入和使用?
答案 0 :(得分:4)
也许CollectionView中“备注”部分中的以下摘录可以回答您的问题:
在WPF应用程序中,所有集合都具有关联的默认值 集合视图。而不是直接与集合合作 绑定引擎始终通过关联访问集合 视图。要获取默认视图,请使用 CollectionViewSource.GetDefaultView方法。基于的内部类 CollectionView是仅实现的集合的默认视图 IEnumerable的。 ListCollectionView是集合的默认视图 实现IList。 BindingListCollectionView是默认视图 对于实现IBindingListView或IBindingList的集合。
或者,您可以在Extensible中创建集合的视图 使用CollectionViewSource的应用程序标记语言(XAML) 类,然后将您的控件绑定到该视图。该 CollectionViewSource类是XAML表示的 CollectionView类。有关示例,请参见如何:排序和分组数据 在XAML中使用View。
因此,如果您没有显式绑定到CollectionViewSource,则始终对原始集合(您在NewValue
中获得的内容)进行集合绑定,但访问集合(例如,通过索引获取项目)是始终通过默认视图完成。因此,声明“将属性绑定到视图而不是原始集合”并不完全正确。
快速测试显示GetDefaultView为我的绑定ObservableCollection返回System.Windows.Data.ListCollectionView。