C # MVVM Стратегии связывания DataGrid? - PullRequest
5 голосов
/ 09 декабря 2010

В чем разница между:

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

и ...

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

Кажется, они оба работают. Разница лишь в том, что второй фрагмент я не могу привязать к SelectedItem. Так почему кто-то выбрал одну стратегию над другой? Почему бы просто не использовать первый фрагмент? Спасибо.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Состояния MSDN ...

CollectionViewSource имеет свойство View, которое содержит фактическое представление, и свойство Source, которое содержит исходную коллекцию.

CollectionViewSource отделяет фактическую коллекцию от представления, представляющего коллекцию.Это дает вам возможность изменять визуальную структуру видимой коллекции (например, отфильтровывать определенные элементы по мере ввода) без фактического изменения базовой коллекции.Это обертка вокруг фактической коллекции, содержащей объекты, требующие визуального представления.У Bea есть отличная статья .

Кроме того, вы заметите явное завершение, которое происходит в CollectionViewSource во втором примере ...

Source="{Binding MyCollection}"

Тогда CollectionViewCource теперь связан с DataGrid, обеспечивающим разделение, о котором я упоминал ранее;в то время как коллекция была связана непосредственно в вашем первом примере.

1 голос
/ 09 января 2012

Кроме того, при условии, что IsSynchronizedWithCurrentItem является истинным для DataGrid, вы можете привязаться к SelectedItem, добавив косую черту, т.е. {Binding /}

1 голос
/ 09 декабря 2010

CollectionViewSource имеет больше возможностей, чем ObservableCollection или что-либо еще IEnumerable, которое вы используете для вашего ItemsSource. Например, он имеет SortDescription , который позволяет вам группировать данные. Пример можно найти здесь .

TLDR; это более мощная структура данных.

...