2012-12-19 20 views
9

好吧,我很困惑。如何綁定到集合確實有效?

如果我的控件具有IEnumerable的依賴項屬性ItemsSource類型和用戶將集合綁定到它我在DependencyPropertyChangedEventArgs.NewValue中有哪些對象?

據我所知CollectionView隱式創建的集合,我希望args.NewValue類型ICollectionView

this blog

當用戶綁定WPF屬性數據的集合,WPF 自動創建一個視圖來包裝的收集,和 屬性綁定到視圖,而不是原始收集。這種行爲始終發生在 之間,並且獨立於CollectionViewSource。

但調試器(VS 2012,.net v.4.0)顯示我在NewValue中收到原始原始收集。 (BindsDirectlyToSource未設置,默認等於false)
這怎麼可能?

我不明白在這種情況下WPF控件如何支持排序,分組和過濾。
CollectionView如何以及何時注入和使用?

回答

4

也許從備註部分下面的提取物CollectionView回答你的問題:

在WPF應用程序,所有集合有關聯的默認 集合視圖。綁定引擎始終通過關聯的 視圖訪問集合,而不是直接使用集合。要獲取默認視圖,請使用 CollectionViewSource.GetDefaultView方法。基於 CollectionView的內部類是僅實現了 IEnumerable的集合的默認視圖。 ListCollectionView是實現IList的集合 的默認視圖。 BindingListCollectionView是實現IBindingListView或IBindingList的集合的默認視圖 。

或者,您可以使用CollectionViewSource 類在可擴展的 應用程序標記語言(XAML)中創建集合的視圖,然後將您的控件綁定到該視圖。 CollectionViewSource的 類是 CollectionView類的XAML表示。有關示例,請參閱如何對數據進行排序和分組 在XAML中使用視圖。

所以,如果你不明確綁定到CollectionViewSource,收集綁定始終以原始集合(你在NewValue獲得),但對集合的訪問取得(如獲得通過索引項)是總是通過默認視圖完成。因此,聲明「將財產與視圖結合,而不是原始收藏」並不完全正確。

一個快速測試顯示GetDefaultView返回一個System.Windows.Data.ListCollectionView爲我的綁定ObservableCollection。

+0

所以這意味着我的控件必須要求CollectionView傳遞集合,並且不支持分組,篩選和開箱即用。控制的責任是實現上述功能,不是嗎? –

+1

當您顯式綁定到[CollectionViewSource](http://msdn.microsoft.com/zh-cn/library/system.windows.data.collectionviewsource)時,可對組合,過濾和排序提供開箱即用的支持的.aspx)。請參閱[綁定到集合](http://msdn.microsoft.com/zh-cn/library/ms752347.aspx#binding_to_collections)中的「如何創建視圖」 – Clemens

+0

嗯,它看起來是肯定的。 GroupItem是由ItemsControl自己創建的... –