如何绑定到集合真的有用吗?

时间:2012-12-19 09:14:39

标签: wpf data-binding collectionview

好吧,我很困惑。

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

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

来自this blog

  

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

但调试器(VS 2012,.net v.4.0)向我显示我在NewValue收到原始原始集合。 (BindsDirectlyToSource未设置,默认情况下等于false)
怎么会这样?!

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

1 个答案:

答案 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