Xamarin.forms: [Propuesta] Implementar CollectionViewSource

Creado en 27 mar. 2018  ·  20Comentarios  ·  Fuente: xamarin/Xamarin.Forms

Descripción

Las principales tecnologías de Microsoft basadas en XAML, como Silverlight, WPF y UWP, tienen una clase denominada CollectionViewSource. Xamarin Forms no lo hace. La interfaz INotifyCollectionChanged es una interfaz muy importante entre los modelos y la interfaz de usuario. La interfaz permite que la interfaz de usuario se actualice sin borrar completamente los elementos de una lista de elementos y reconstruir esos elementos desde cero cada vez que se agrega o elimina un elemento. Esto mejora el rendimiento y la capacidad de respuesta.

CollectionViewSource tiene como objetivo proporcionar una implementación común de INotifyCollectionChanged en todas las tecnologías, y también proporcionar una funcionalidad común de filtrado y clasificación en los controles a través de la interfaz INotifyCollectionChanged. Cuando CollectionViewSource no está disponible, un control debe implementar el filtrado y la clasificación por sí mismo, lo cual es más o menos un truco. Por ejemplo, ListView tiene esta propiedad (https://developer.xamarin.com/api/property/System.Windows.Forms.ListView.Sorting/).

CollectionViewSource proporciona una capa de abstracción para filtrar, agrupar y ordenar para que cualquier control que implemente no necesite volver a implementar la funcionalidad que ya existe en la clase CollectionViewSource. También significa que el filtrado y la clasificación se pueden aplicar a un nivel que no afecta al modelo. Por ejemplo, si la ordenación de una lista determinada puede causar algún efecto secundario si se cambia el modelo subyacente, la ordenación aún se puede lograr con CollectionViewSource porque CollectionViewSource no cambia el modelo subyacente.

Muchos de los controles del kit de herramientas XF, como ListView y Picker, etc. probablemente necesitarán implementar la funcionalidad de alguna manera. El uso más común de la clase en otras plataformas fue para DataGrids, pero esto no existe en el kit de herramientas estándar de XF. Sin embargo, los controles de terceros como SyncFusion DataGrid podrían alinearse con los estándares estándar de Microsoft si esos estándares existieran para Xamarin Forms.

Artículo de MSDN
https://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource (v = frente a 110) .aspx

Muestras de WPF
https://github.com/Microsoft/WPF-Samples/tree/master/Data%20Binding/CollectionViewSource

Un artículo:
https://www.hanselman.com/blog/CollectionViewSourceIsCrazyUsefulForBindingToFilteredObservableCollectionsOnWindowsPhone8.aspx

collectionview high impact proposal-open enhancement ➕

Comentario más útil

Esto es absolutamente necesario.

Todos 20 comentarios

ListViews, Pickers y algunos controles más ya escuchan eventos INCC

@StephaneDelcroix , eso es bastante justo, como deberían. Pero, lo que se requiere está muy por encima de lo que proporciona la funcionalidad estándar INotifyCollectionChanged. Como punto básico, INCC no es muy útil sin la clasificación en línea de listas. Si se vincula a una ObservableCollection <>, ¿cómo se supone que debe ordenar el contenido? Bueno, puede hacer una clasificación manual de burbujas, pero llamar a Enumerable.OrderBy (TSource, TKey) no ayudará porque terminará con un nuevo IEnumerable que causará una actualización completa de todos modos.

CollectionViewSource siempre ha sido una gran parte de las tecnologías XAML para proporcionar una solución al problema que acabo de mencionar. Sin él, necesitaríamos escribir código para ordenar listas como ObservableCollection <> para iniciar la ordenación. Pero incluso entonces, surge el problema de los efectos secundarios. Sin CollectionViewSource, a XF le falta una gran parte de la funcionalidad que viene de serie con otras tecnologías XAML.

Esto ni siquiera toca el filtrado y la agrupación ... Sin esto, todos los controles XF, incluidos los controles de terceros como SyncFusion, se dispararán por su propia cuenta, y ninguno de ellos será compatible con el sistema estándar que se ha utilizado. una parte del ecosistema XAML desde WPF.

Por otro lado, mis jefes me presionan constantemente para que ofrezca clasificación, filtrado, agrupación, etc. Entonces, les hemos entregado soluciones parciales en nuestra aplicación con nuestro propio código. Pero no proporciona nada parecido a lo que solía estar disponible en Silverlight y WPF. Nos hemos visto obligados a usar controles SyncFusion en lugares que se desvían completamente del paradigma de Microsoft para obtener la funcionalidad. Una y otra vez, experimentamos bloqueos y demás debido a estos controles, por lo que no podemos confiar en ellos.

CollectionViewSource es un requisito fundamental del espacio de tecnología XAML.

INCC! = CollectionViewSource

¿Hay algo que le impida escribir su propio CollectionViewSource ?

la única parte que veo que falta es la capacidad de los objetos enlazables en ResourceDictionaries para obtener un contexto de enlace heredado. Esto podría solucionarse, pero es muy fácil solucionarlo vinculando con una fuente

ninguno de ellos será compatible con el sistema estándar

¿A qué compatibilidad te refieres? ¿Solo la sintaxis general que ha tomado XAML para CollectionViewSources?

¿Contra qué tamaño de colecciones está operando?

Si se vincula a una ObservableCollection <>, ¿cómo se supone que debe ordenar el contenido?

La mayoría de las implementaciones que he visto usan una lista de proxy de solo lectura ... ReactiveList, DynamicData, y estoy bastante seguro de que CollectionViewSource hace esto también con ICollectionView que expone. No opera contra la lista Fuente, proyecta la lista Fuente en una vista de solo lectura. Las actualizaciones pequeñas simplemente se sincronizan, pero luego las actualizaciones más grandes solo causan un reinicio y una actualización.

Me doy cuenta de que si no eres un fanático reactivo, esto no es un arranque, pero
https://github.com/RolandPheasant/DynamicData
Es increíble y nunca he tenido problemas con el manejo de conjuntos de datos más grandes.

Marqué esta propuesta como abierta porque tengo un poco de curiosidad por esta.

@StephaneDelcroix

¿Hay algo que le impida escribir su propio CollectionViewSource?

Hay implementaciones a considerar en ambos lados de la clase. Es decir, la clase en sí necesita ordenar, filtrar y agrupar, lo que sí, podríamos escribir nosotros mismos. Pero eso es solo una parte de la ecuación. Los controles deben implementar la lógica para dirigir la clasificación, el filtrado, etc. Por ejemplo, en WPF y Silverlight, DataGrids interactuaría con CollectionViewSource al hacer clic en el encabezado de una columna determinada. Esto provocaría un recurso por columna. Xamarin Forms no tiene actualmente un DataGrid oficial. Pero, un efecto secundario de no tener un DataGrid significa que terceros como SyncFusion han escrito su propio DataGrid. No hay nada de malo con su DataGrid per se, pero no han desacoplado su control con un Microsoft CollectionViewSource estándar. Toda su lógica de clasificación está integrada en su control y no se comparte con ningún otro control. Entonces, si queremos su funcionalidad de clasificación, tenemos que usar su control, o nada en absoluto. Incluso si escribiéramos nuestra propia versión completa de CollectionViewSource, aún necesitaríamos crear algo como su DataGrid para capturar el evento de clic del encabezado de columna y establecer la columna de clasificación en CollectionViewSource.

Xamarin Forms no necesita crear un DataGrid para que esto sea útil. Puede ser útil para ListViews y Pickers, etc. Pero es necesario implementar otros controles y funcionalidades. Por ejemplo, en nuestra aplicación hemos creado algo muy similar a CollectionViewSource en un nivel básico (clase intermedia). Hemos creado ButtonBehaviors que cuando se adjuntan, establecen la columna de clasificación en la clase intermedia y permiten la clasificación independientemente de la colección de nivel base.

Esta es una pieza de infraestructura mucho más grande que una sola clase. En las otras plataformas XAML, CollectionViewSource no es una clase aislada. Interactúa con otras clases de formas específicas. Es necesario que haya un conjunto de controles, comportamientos, comandos, etc. para esta funcionalidad. Por ejemplo, puede haber una hoja de acción que muestra una lista de nombres de propiedad (por alias), y cuando el usuario selecciona un elemento de la lista, CollectionViewSource activa una clasificación por esa propiedad.

Si esto no se implementa pronto, los controles de terceros, etc., se irán por su propia cuenta y pondrán cada vez más trabajo en la funcionalidad de clasificación / filtrado hacky que es específica de cada control. El código no se compartirá entre los controles de tipo de lista y, en general, esto será malo para Xamarin Forms a largo plazo.

A continuación, se muestra un ejemplo de la funcionalidad de clasificación que se ha implementado para un control específico, pero esa funcionalidad no se comparte con otros controles similares: https://developer.xamarin.com/api/property/System.Windows.Forms.ListView.Sorting /

@PureWeen , ¿qué pasa con este problema que necesita información? CollectionViewSource es un estándar de Microsoft en las tecnologías basadas en XAML. ¿Qué más información necesitas?

Lo siento, debo haber perdido tu pregunta aquí.

¿A qué compatibilidad te refieres? ¿Solo la sintaxis general que ha tomado XAML para CollectionViewSources?

En WPF, Silverlight y UWP, los controles que implementan CollectionViewSource funcionan de la misma manera. Cuando se introduce un control de terceros (por ejemplo, SfDataGrid) para llenar el hueco del CollectionViewSource faltante, trae consigo una clasificación, filtrado y agrupación que no es compatible con la funcionalidad CollectionViewSource basada en Microsoft XAML estándar. Siempre será peculiar de la tercera parte que construye el control.

Esto es absolutamente necesario.

@jassmith gracias!

Vamos chicos, esto es tan necesario. Reconstruir una lista porque un filtro o un orden ha cambiado es muy torpe.

Vea aquí: No es realmente la mejor solución.
https://forums.xamarin.com/discussion/32481/observablecollection-with-filter

Definitivamente necesario, este es un elemento muy útil en WPF que falta dolorosamente en Xamarin.

¿Cómo interfiere esta solicitud de función con el nuevo control CollectionView de Xamarin Forms 4.0, que no es en absoluto lo mismo que WPF System.Windows.Data.CollectionView o System.ComponentModel.ICollectionView?

Recién estoy comenzando a trabajar con Xamarin Forms después de años de experiencia con WPF. Y estoy muy decepcionado de que no haya implementación de CollectionViewSource en Xamarin.

Vine aquí porque me preguntaba si hay algo como CollectionViewSource. Estas características son cruciales al considerar qué tecnología (como Xamarin.Forms) usar para crear aplicaciones móviles.
Mientras no haya soporte integrado, tendré que ceñirme a mi propia implementación.

A menos que me falte algo, CollectionViewSource de UWP también carece de ordenación incorporada.

Hay un complemento de UWP AdvancedCollectionView en WindowsCommunityToolkit , que agrega agrupación y ordenación.

No estoy familiarizado con los detalles; Solo menciono en caso de que sea beneficioso ver lo que se ha hecho allí y / o coordinar una solución estándar con las personas que trabajan en UWP.

Además, la discusión SO de esta característica faltante de UWP y algunos intentos de mejora. .

Vine aquí para lanzar mi sombrero virtual en el anillo de "necesitamos esto". El filtrado, la ordenación y la agrupación automáticos son una parte tan fundamental de la experiencia de WPF / XAML que me estoy rascando la cabeza preguntándome por qué es incluso una cuestión de si es necesario o no aquí en Xamarin.

@jbhaywood Es totalmente necesario, como muchas otras cosas.

Desafortunadamente, algo como CollectionViewSource no es lo suficientemente sexy como para que un empleado de Microsoft pueda presumir de ello en una publicación de blog o en una conferencia. Y dado que Microsoft ni siquiera usa Xamarin.Forms para sus productos, ni siquiera sienten los puntos débiles de nosotros, los desarrolladores.

¿Fue útil esta página
0 / 5 - 0 calificaciones