2010-12-09 21 views
5

Quelle est la différence entre:C# MVVM DataGrid Binding Strategies?

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

et ...

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

Ils ont tous deux semblent fonctionner. La seule différence est que le deuxième extrait, je ne peux pas lier à SelectedItem. Alors pourquoi quelqu'un choisir une stratégie sur l'autre? Pourquoi quelqu'un n'utiliserait-il pas le premier extrait? Merci.

Répondre

2

déclare MSDN ...

CollectionViewSource possède une propriété Voir qui détient la vue réelle et une propriété source qui détient la collection source .

CollectionViewSource sépare la collection réelle de la vue qui représente la collection. Cela vous donne la possibilité de modifier la structure visuelle de la collection visible (pensez à filtrer certains éléments au fur et à mesure que vous tapez) sans modifier réellement la collection sous-jacente. C'est une enveloppe autour de la collection contenant les objets nécessitant une représentation visuelle. Bea a un bon article à ce sujet.

En outre, vous remarquerez l'emballage explicite qui se déroule dans le CollectionViewSource dans votre deuxième exemple ...

Source="{Binding MyCollection}" 

Alors le CollectionViewCource est maintenant lié à la via DataGrid fournissant le seperation je l'ai mentionné plus tôt; alors que la collection était liée directement à votre premier exemple.

1

Une CollectionViewSource possède plus de fonctionnalités qu'une collection ObservableCollection ou tout autre IEnumerable que vous utilisez pour votre ItemsSource. Par exemple, il a SortDescriptions qui peut vous permettre de regrouper des données. Un exemple peut être trouvé here.

TLDR; C'est une structure de données plus puissante.

1

En aparté, à condition IsSynchronizedWithCurrentItem est vrai sur le DataGrid, vous pouvez lier à la SelectedItem par une barre oblique annexant {dire Binding /}