¿Debería uno unirse DataGrida la
ICollectionView = CollectionViewSource.GetDefaultView(collection)
o al
ObservableCollection<T> collection; ???
¿Cuál es la mejor práctica para MVVM y por qué?
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 collectiono hacia collectionViewes 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>implementaINotifyCollectionChangedy notificará a la interfaz de usuario cuando se hayan cambiado los elementos de la colección.ICollectionViewle dará la capacidad de filtrar, ordenar o agrupar la colección además de propagarINotifyCollectionChangedeventos si la colección subyacente lo implementa.Cualquiera de los dos tipos funciona bien con MVVM siempre que se vincule a él. Úselo
ICollectionViewcuando necesite ordenar, filtrar o agrupar. ÚseloObservableCollection<T>directamente cuando no lo haga.fuente
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
ICollectionViewy usar una clase, que la implemente, pero que no sea parte de WPF en sí.fuente
No creo que tenga que ver nada consigo
MVVMmismo.ICollectionViewproporciona características adicionales como agrupación de soring, etc., si las necesita, de loIColectionViewcontrario, simplemente useObservableCollectionfuente
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.
fuente