假设我有这个:
public IList<TestObj> collection { get; set; }
public MainWindow()
{
this.DataContext = this;
collection = new ObservableCollection<TestObj>();
InitializeComponent();
}
<DataGrid x:Name="grid" ItemsSource="{Binding collection}" IsSynchronizedWithCurrentItem="True">
</DataGrid>
相当标准的WPF东西。但是当检查即时窗口时,这让我感到惊讶:(grid.Items实现了ICollectionView)
CollectionViewSource.GetDefaultView(collection) == grid.Items
false
但是当然...
CollectionViewSource.GetDefaultView(collection) == CollectionViewSource.GetDefaultView(grid.Items.SourceCollection)
true
从对象检索collectionview的那种神秘的静态方法使我感到惊讶,我认为它会这样做:检索绑定对象将要查看的collection视图,但是看来ICollectionview接口的两个不同实现者可以共存
干杯!
grid.Items实现ICollectionView
这是因为ItemsControl.Items
始终执行ICollectionView
。它始终是的实例ItemCollection
,可以继承CollectionView
,当然也可以实现ICollectionView
。
换句话说,默认集合ItemsControl
本身实现了ICollectionView
。但这并不需要以任何方式成为控件使用的实际视图。实际上,如果您将其他集合绑定到ItemsSource
,则可以说您将ICollectionView
为该不同的集合获得不同的实现。毕竟,是为自己ItemCollection
实现ICollectionView
的,而不是为任何其他集合实现的。该ItemsSource
集合是“任何其他集合”。
或者换一种方式来看,ICollectionView
返回的ItemsControl.Items
是Items
集合本身的视图(恰好集合是它自己的视图)。另一方面,ICollectionView
返回的CollectionViewSource.GetDefaultView(collection)
是的视图collection
,该视图必须与的视图不同Items
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句