¿Debo unirme a ICollectionView u ObservableCollection?

¿Debería uno vincular DataGrid al

ICollectionView = CollectionViewSource.GetDefaultView(collection)

o al

ObservableCollection collection; ???

¿Cuál es la mejor práctica para MVVM y por qué?

Siempre se vincula a un ICollectionView , ya sea que lo haga explícito o no.

Supongamos que tenemos

 var collection = new ObservableCollection(); var collectionView = CollectionViewSource.GetDefaultView(collection); 

En este caso, el enlace a collection o collectionView es uno y lo mismo: el motor de enlace se vinculará a la vista de colección predeterminada (que es referencia igual a collectionView ) si le dice que se vincule a la collection .

Esto significa que la respuesta a su pregunta es “no hace absolutamente ninguna diferencia”.

Solo para ser totalmente claro: incluso si se vincula directamente a la colección, el motor vinculante se vinculará a la vista predeterminada. La modificación de las propiedades de la vista, como los criterios de clasificación, afectará al enlace que parece vincularse directamente a la colección, ya que detrás de las cubiertas se vincula a la vista predeterminada.

Sin embargo, hay otra pregunta interesante y relacionada: ¿debería vincularse a la vista de colección predeterminada (es decir, a la propia colección, porque no hay ninguna 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 enlaces múltiples a la misma colección, y los controles vinculados necesitan tener nociones distintas de elemento actual, filtros y compañía, entonces lo que desea es vincular explícitamente a múltiples vistas de la misma colección subyacente.

ObservableCollection implementa INotifyCollectionChanged y notificará a la UI cuando se cambien los elementos en la colección.

ICollectionView le dará la capacidad de filtrar, ordenar o agrupar la colección además de INotifyCollectionChanged eventos INotifyCollectionChanged si la colección subyacente lo implementa.

Cualquiera de los tipos funciona bien con MVVM siempre que se vincule a él. Use ICollectionView cuando necesite clasificar, filtrar o agrupar. Use ObservableCollection directamente cuando no lo haga.

Solo para agregar a lo que Jon dijo. La principal diferencia es que al usar CollectionViewSource.GetDefaultView(collection) , usted está haciendo 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 lo implemente, pero que no sea parte de WPF.

No creo que tenga que hacer nada con MVVM . ICollectionView proporciona funciones adicionales como agrupación de soring y etc. si necesita usar IColectionView contrario simplemente use ObservableCollection

Se vinculará a la vista si desea que su cuadrícula muestre la configuración aplicada a la vista, por ejemplo, el filtrado, de lo contrario la vista es redundante.