2010-12-09 116 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 /}