2010-12-09 16 views
5

¿Cuál es la diferencia entre:C# MVVM DataGrid vinculante estrategias?

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

y ...

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

Ambos parecen funcionar. La única diferencia es que, en el segundo fragmento, no puedo enlazar con SelectedItem. Entonces, ¿por qué alguien elegiría una estrategia sobre la otra? ¿Por qué alguien no usaría el primer fragmento? Gracias.

Respuesta

2

MSDN indica ...

CollectionViewSource tiene una vista propiedad que tiene el punto de vista real y una propiedad de fuente que alberga la colección fuente.

CollectionViewSource separa la colección real de la vista que representa la colección. Esto le da la capacidad de cambiar la estructura visual de la colección visible (piense en filtrar ciertos elementos mientras escribe) sin cambiar realmente la colección subyacente. Es un envoltorio alrededor de la colección real que contiene los objetos que necesitan una representación visual. Bea tiene un gran article al respecto.

Además se dará cuenta de la envoltura explícita que tiene lugar en el CollectionViewSource en su segundo ejemplo ...

Source="{Binding MyCollection}" 

Entonces el CollectionViewCource ahora se está obligado a proporcionar a través de la DataGrid la separación he mencionado anteriormente; mientras que la colección estaba vinculada directamente en su primer ejemplo.

1

Un CollectionViewSource tiene más características que un ObservableCollection o cualquiera que sea IEnumerable que use para su ItemsSource. Por ejemplo, tiene SortDescriptions que le permite agrupar datos. Se puede encontrar un ejemplo here.

TLDR; es una estructura de datos más poderosa.

1

Como acotación al margen, siempre IsSynchronizedWithCurrentItem es cierto en la cuadrícula de datos, puede enlazar a la SelectedItem añadiendo una barra de unión es decir, {/}