¿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é?
¿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é?
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 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>implementa INotifyCollectionChangedy 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 propagar INotifyCollectionChangedeventos 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. Ú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 ICollectionViewy usar una clase, que la implemente, pero que no sea parte de WPF en sí.
No creo que tenga que ver nada consigo MVVMmismo. ICollectionViewproporciona características adicionales como agrupación de soring, etc., si las necesita, de lo IColectionViewcontrario, 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.