2010-12-09 76 views
5

是什么区别:...C#MVVM DataGrid绑定策略?

<DataGrid 
    ItemsSource="{Binding MyCollection}" 
/> 

<CollectionViewSource x:Key="CollectionData" Source="{Binding MyCollection}"/> 
... 
<DataGrid 
    DataContext="{StaticResource CollectionData}" 
    ItemsSource="{Binding}" 
/> 

他们都似乎工作。唯一的区别是第二个片段,我不能绑定到SelectedItem。那么为什么有人会选择另一种策略呢?为什么不会有人使用第一个片段?谢谢。

回答

2

MSDN指出...

CollectionViewSource有一个View 财产保存实际视图 和保持 源集合源属性。

CollectionViewSource从表示集合的视图中分离出实际的集合。这使您可以更改可见集合的可视化结构(思考在键入时过滤掉某些项目),而无需实际更改基础集合。它是包含需要可视化表示的对象的实际集合的包装。 Bea对它有很棒的article

此外,你会发现明确的包装发生在你的第二个例子中,CollectionViewSource ...

Source="{Binding MyCollection}" 

然后CollectionViewCource现在被绑定到通过DataGrid提供我刚才提到的分离 - ;而集合直接绑定在你的第一个例子中。

1

CollectionViewSource具有更多的功能,ObservableCollection或其他IEnumerable用于您的ItemsSource。例如,它具有SortDescriptions,可以让您对数据进行分组。一个例子可以发现here

TLDR;它是一个更强大的数据结构。

1

另外,如果在DataGrid上提供了IsSynchronizedWithCurrentItem,则可以通过附加斜杠来绑定SelectedItem,即{Binding /}