¿Debería uno unirse DataGrid
a la
ICollectionView = CollectionViewSource.GetDefaultView(collection)
o al
ObservableCollection<T> collection;
???
¿Cuál es la mejor práctica para MVVM y por qué?
¿Debería uno unirse DataGrid
a la
ICollectionView = CollectionViewSource.GetDefaultView(collection)
o al
ObservableCollection<T> collection;
???
¿Cuál es la mejor práctica para MVVM y por qué?
Respuestas:
Usted siempre se enlaza a una ICollectionView
, si usted lo hace explícita o no.
Supongamos que tenemos
var collection = new ObservableCollection<string>();
var collectionView = CollectionViewSource.GetDefaultView(collection);
En este caso, la vinculación hacia collection
o hacia collectionView
es una y la misma: el motor de vinculación se vinculará a la vista de colección predeterminada (que es la referencia igual a collectionView
) si le dice que se vincule collection
.
Esto significa que la respuesta a su pregunta es "no hace ninguna diferencia".
Para ser totalmente claro: incluso si se vincula a la colección directamente, el motor de vinculación se vinculará a la vista predeterminada. La modificación de las propiedades de la vista, como los criterios de clasificación, afectará el enlace que parece enlazar directamente con la colección, ya que detrás de las cubiertas es un enlace a la vista predeterminada.
Sin embargo, hay otra pregunta interesante y relacionada: ¿debería uno vincularse a la vista de colección predeterminada (es decir, a la colección en sí, porque no hay razón para vincularse explícitamente a la vista predeterminada) oa otra vista de la misma colección?
Teniendo en cuenta que cada vista tiene su propia noción de elemento actual, criterios de clasificación, etc., se deduce que si tiene la intención de tener múltiples enlaces a la misma colección, y los controles vinculados deben tener nociones distintas de elemento actual, filtros y compañía, entonces lo que desea es enlazar explícitamente a varias vistas de la misma colección subyacente.
ObservableCollection<T>
implementa INotifyCollectionChanged
y notificará a la interfaz de usuario cuando se hayan cambiado los elementos de la colección.
ICollectionView
le dará la capacidad de filtrar, ordenar o agrupar la colección además de propagar INotifyCollectionChanged
eventos si la colección subyacente lo implementa.
Cualquiera de los dos tipos funciona bien con MVVM siempre que se vincule a él. Úselo ICollectionView
cuando necesite ordenar, filtrar o agrupar. Úselo ObservableCollection<T>
directamente cuando no lo haga.
Solo para agregar a lo que dijo Jon. La principal diferencia es que al usarlo CollectionViewSource.GetDefaultView(collection)
, hace que ViewModel dependa de WPF. A muchos puristas de MVVM no les gusta esto y esto dejaría a ObservableCollection como la única opción válida.
Otra opción sería usar ICollectionView
y usar una clase, que la implemente, pero que no sea parte de WPF en sí.
No creo que tenga que ver nada consigo MVVM
mismo. ICollectionView
proporciona características adicionales como agrupación de soring, etc., si las necesita, de lo IColectionView
contrario, simplemente useObservableCollection
Debería vincularse a la vista si desea que su cuadrícula muestre la configuración aplicada a la vista, por ejemplo, filtrado; de lo contrario, la vista es redundante.