2015-10-30 32 views
0

假设我有这样的:为什么将一个集合绑定到另一个collectionview中的datagrid结果?

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的神秘静态方法令我感到意外,我认为它会这样做:检索绑定对象将会看到的集合视图,但它看起来有两种不同的ICollectionview接口实现者可以共存

干杯!

回答

0

grid.Items实现ICollectionView

这是因为ItemsControl.Items总是实现ICollectionView。它始终是ItemCollection的一个实例,它继承CollectionView,当然这实现了ICollectionView

换句话说,ItemsControl本身的默认集合实现了ICollectionView。但是这并不需要成为控件使用的实际视图。事实上,如果你绑定了一个不同的集合到ItemsSource,那么你可以得到不同集合的ICollectionView的不同实现。毕竟,ItemCollection自己实现ICollectionView,而不是任何其他收集。而ItemsSource集合是“任何其他集合”。

或者以另一种方式看,由ItemsControl.Items返回的是Items集合本身的视图(它恰好是集合是它自己的视图)。另一方面,由CollectionViewSource.GetDefaultView(collection)返回的ICollectionViewcollection的视图,其必然不同于Items的视图。

相关问题