有什么区别:
<DataGrid
ItemsSource="{Binding MyCollection}"
/>
和...
<CollectionViewSource x:Key="CollectionData" Source="{Binding MyCollection}"/>
...
<DataGrid
DataContext="{StaticResource CollectionData}"
ItemsSource="{Binding}"
/>
他们似乎都工作。唯一的区别是第二个片段,我无法绑定到SelectedItem。那么为什么有人会选择一种策略呢?为什么有人不会只使用第一个片段?感谢。
答案 0 :(得分:2)
MSDN声明......
CollectionViewSource有一个View 保存实际视图的属性 和一个持有。的Source属性 来源集合。
CollectionViewSource从表示集合的视图中分离实际集合。这使您能够更改可见集合的可视结构(在您键入时考虑过滤掉某些项目),而无需实际更改基础集合。它是包含需要可视化表示的对象的实际集合的包装器。 Bea对此有很好的article。
此外,您会注意到第二个示例中CollectionViewSource
发生的明确包装......
Source="{Binding MyCollection}"
然后CollectionViewCource
现在被DataGrid
约束,提供我之前提到的分离;而在第一个例子中,该集合直接受到约束。
答案 1 :(得分:1)
CollectionViewSource具有更多功能,包括ObservableCollection或您用于ItemsSource的任何IEnumerable
。例如,它有SortDescriptions,可以让您对数据进行分组。可以找到一个示例here。
TLDR;它是一个更强大的数据结构。
答案 2 :(得分:1)
顺便提一下,如果DataGrid上的IsSynchronizedWithCurrentItem为true,则可以通过附加斜杠绑定到SelectedItem,即{Binding /}