¡Hola miembros de la comunidad! Hemos visto que DataGrid ha sido una pieza valiosa del Kit de herramientas de la comunidad de Windows para muchos de ustedes y estamos interesados en graduarlo como un control nativo de WinUI (!!). Necesito su ayuda para averiguar qué se necesitaría para hacer que un DataGrid a gran escala sea lo mejor posible.
Quiero escuchar su opinión sobre todo lo relacionado con DataGrid. Para comenzar, siéntase animado a responder tantas preguntas como tenga tiempo para:
¡Gracias de antemano a todos! Vea los enlaces a continuación para algunos refrescos y contexto.
Leer sobre la documentación de DataGrid
Descargue e interactúe con DataGrid a través de la descarga del paquete DataGrid Nuget
Actualice sus conocimientos comprobando la implementación de DataGrid de código abierto existente
Más modos de visualización. Eche un vistazo al Explorador de archivos y sus vistas de iconos. El DataGrid debería poder mostrar íconos / elementos en una cuadrícula con agrupación, así como las filas y columnas encabezadas.
Sé que esto puede no ser posible o fuera de alcance, pero es un aspecto de WinUI vs Win32 que no es tan fácil como 1: 1, y una versión moderna del Explorador de archivos, o los cuadros de diálogo de archivos comunes, pueden necesitar de tal control. Este podría ser ese control, no un control personalizado interno.
Mi lista de deseos: para mí, una buena cuadrícula de datos incluye todas las características siguientes de forma predeterminada. Estoy tomando prestadas algunas capturas de pantalla del mundo html.
Filtre fácilmente toda la página con el recuento de filas preferido.
Seleccionar / anular la selección de columnas visibles, clasificación de columnas, copiar, imprimir
Exportar datos a un formato específico.
Reordenación de columnas arrastrando la columna.
Filtrado de columnas
Encabezado fijo: donde el encabezado permanece en la parte superior incluso cuando se desplaza
Detalles de fila con plantilla XAML para obtener detalles.
Agrupación de filas
Orden de filas de arrastrar y soltar
En mi opinión, las características anteriores deberían ser estándar en todas las cuadrículas de datos.
Si desea que la cuadrícula de datos se destaque en el mundo html, también incluiría lo siguiente. Me encuentro muchas veces mirando una cuadrícula de datos y luego estableciéndome en una vista de lista ya que la cuadrícula de datos carece de estas características.
Desliza la fila lateralmente para incluir funciones como editar, eliminar, marcar, etc.
Las características anteriores manejan principalmente la "presentación de datos", lo que todavía falta en WinUI es lo que creo que debería ser una característica nativa de WinUI (control) como Microsoft Pivot Control. para complementar la cuadrícula de datos.
MS ya tiene el código fuente para esto y fue un control absolutamente increíble en los días.
https://www.youtube.com/watch?v=ZJIkQ9nebKY
Ahora cubre la presentación y visualización de datos que deberían ser el mínimo para diferenciar a WinUI de todas las características básicas que existen.
Lo más importante es que realmente muestra el poder de las "aplicaciones nativas" que deberían incluir animaciones asombrosas y controles visualmente atractivos que son poderosos y se ven realmente geniales.
Puedo llevar esto un paso más allá y decir que después de las características anteriores (visualizaciones) podemos incluir animaciones 2D / 3D que crean un concepto de profundidad en los datos y nos llevarán a una estratosfera diferente, pero supongo que eso es para otro día; ))
Un buen punto de partida es mirar a su socio Telerik con su RadDataGrid (UWP Open Source). Con uno de mis clientes, lo usé y realmente funciona bien. Es muy rápido y versátil. Lo único que es difícil es su código, no hay forma de modificar nada de su motor sin una buena comprensión de la arquitectura.
Esperaría que el nuevo DataGrid tenga el mismo rendimiento que Telerik.
Estoy muy contento de ver que el equipo de WinUI está considerando un control DataGrid.
Las mejoras más sustanciales que me gustaría ver de un nuevo control para reemplazar el Toolkit DataGrid:
La opción de tener un botón de edición que coloque iconos arrastrables al lado de cada fila para mover el orden sería una característica útil. También sería genial ver que algunas sombras detrás de la fila se levantan y mueven (ya que uno de los atributos principales de Fluent es la profundidad). Las flechas pequeñas hacia arriba y hacia abajo pueden ser buenas junto al icono de arrastrar para mover las filas más fácilmente con la entrada del mouse. Si se mueve una fila con las flechas, una animación de deslizamiento sutil sería un buen toque. Con la entrada táctil, la opción de mantener una fila y simplemente moverla sin siquiera tener que presionar el botón de edición también podría funcionar bien. No estoy seguro de si esto ya es compatible, pero pude ver casillas de verificación de selección como en el Explorador de archivos, lo que hace obvio qué DataGrids admiten la selección de filas y simplemente mejoran la UX general. La aplicación de recordatorios de iOS contiene algunas de estas ideas (los ejemplos se muestran a continuación). La aplicación iOS Stocks también tiene un tipo similar de trato con filas móviles. La mayoría de estas ideas también funcionarían muy bien para columnas.
@NoahFeller Ese tipo de acción tiene más sentido para una vista de lista. Con una vista de cuadrícula, no está reorganizando el orden, debería haber opciones de clasificación, pero el usuario no está arrastrando cosas.
*Editar
Después de pensarlo un poco más, veo cómo esta opción puede ser útil. Sin embargo, definitivamente no creo que este deba ser el comportamiento predeterminado.
@NoahFeller Ese tipo de acción tiene más sentido para una vista de lista. Con una vista de cuadrícula, no está reorganizando el orden, debería haber opciones de clasificación, pero el usuario no está arrastrando cosas.
*Editar
Después de pensarlo un poco más, veo cómo esta opción puede ser útil. Sin embargo, definitivamente no creo que este deba ser el comportamiento predeterminado.
Sí, probablemente tengas razón @yaichenbaum. Estaba visualizando esas sugerencias como la capacidad de hacer una clasificación personalizada y pensé que arrastrar podría ser útil para eso. Así que estoy de acuerdo, definitivamente no es el predeterminado, pero podría ser bastante útil como opción. ¡Gracias por la respuesta!
La simplicidad de la función de tabla de datos a cuadrícula de datos de WPF. De hecho, he estado luchando durante la última semana tratando de hacer que una cuadrícula de datos de UWP funcione como lo tenía en WPF, donde podría vincular una cuadrícula de datos a una vista de datos, luego llenar la vista de datos de SQL con una vista predeterminada de tabla de datos. La cuadrícula simplemente mostró la tabla de datos. Fue increíblemente simple de hacer, y UWP hasta ahora lo ha hecho ridículamente complicado.
hazlo multiplataforma
Me gustaría solicitar un modo de selección de celda única, estilo Excel.
El objetivo final es un modo con el comportamiento exacto de WinForms DataGridView.
Tener una variedad de opciones de virtualización que pueden admitir diferentes casos de uso (desde opciones de virtualización de desplazamiento simple como el reciclaje hasta otros conceptos como la paginación de datos)
A menudo (en controles de escritorio similares que admiten esto), algunas de estas opciones comienzan a fallar cuando se utilizan con plantillas personalizadas para columnas con datos únicos. Cuanto más puedan soportar en esos casos, mejor.
Si es posible, la propuesta de Paging Control # 268 debe sincronizarse y los ganchos necesarios deben agregarse al control DataGrid.
¡Estas son buenas noticias! He estado esperando algo oficial en el frente de DataGrid durante un tiempo desde que apareció en el kit de herramientas de la comunidad. Este es realmente el último control que falta en WinUI 3.0 para el que el kit de herramientas de la comunidad no tiene una buena alternativa.
Primero, por favor, no reinventes la rueda. Como base, comience con la implementación de WPF de DataGrid (sé que no puede usar el código, pero use el 100% de la API), NO la de Silverlight. WPF DataGrid tenía muchas más funciones y tenía menos errores en mis pruebas.
Al usar el kit de herramientas de la comunidad DataGrid, también solicité las siguientes adiciones de API que surgieron para varios casos de uso. Discusión aquí :
También sigo teniendo muchos problemas con la comunidad que tomó DataGrid restableciendo la posición de desplazamiento a la parte superior después de que se cambia ItemsSource. Esto debe arreglarse para que el desplazamiento se conserve como en WPF; sin embargo, también necesitamos poder controlar esto, por lo que sugeriría la siguiente API también:
@RBrid También ayudó con algunos análisis aquí :
Nuevos eventos sugeridos y algunas mejoras a los eventos preexistentes:
| Evento | Comentarios |
| : --- | : --- |
| ContextRequestedForColumnHeader
| Para admitir la visualización de un menú contextual (u otro menú flotante) cuando se hace clic con el botón derecho en el encabezado de una columna. Lo mismo que Windows.UI.Xaml.UIElement.ContextRequested
pero para los encabezados de columna en lugar de todo el DataGrid. |
| ContextCanceledForColumnHeader
| Lo mismo que Windows.UI.Xaml.UIElement.ContextCanceled
pero para los encabezados de columna en lugar de todo el DataGrid. |
| ContextRequestedForRow
| Para admitir la visualización de un menú contextual (u otro menú flotante) cuando se hace clic con el botón derecho en una fila. Lo mismo que Windows.UI.Xaml.UIElement.ContextRequested
pero para filas en lugar de todo el DataGrid. |
| ContextCanceledForRow
| Lo mismo que Windows.UI.Xaml.UIElement.ContextCanceled
pero para filas en lugar de todo el DataGrid. |
| RowTapped
| Tenga en cuenta también el caso de tocar una fila que ya está seleccionada. |
| RowDoubleTapped
| Lo mismo que Windows.UI.Xaml.UIElement.DoubleTapped
pero para filas en lugar de todo el DataGrid. |
| RowRightTapped
| Lo mismo que Windows.UI.Xaml.UIElement.RightTapped
pero para filas en lugar de todo el DataGrid. Consulte también ContextRequestedForRow
. |
| PointerPressedInRow
| Lo mismo que Windows.UI.Xaml.UIElement.PointerPressed
pero para filas en lugar de todo el DataGrid. |
| PointerReleasedInRow
| Lo mismo que Windows.UI.Xaml.UIElement.PointerReleased
pero para filas en lugar de todo el DataGrid. |
| PointerMovedInRow
| Lo mismo que Windows.UI.Xaml.UIElement.PointerMoved
pero para filas en lugar de todo el DataGrid. Posiblemente PointerMovedInRow
solo se activaría mientras se captura el puntero. |
| ColumnHeaderTapped
| Tenga en cuenta también el caso de tocar un encabezado de columna que ya está seleccionado. |
| ColumnHeaderDoubleTapped
| Lo mismo que Windows.UI.Xaml.UIElement.DoubleTapped
pero para los encabezados de columna en lugar de todo el DataGrid. |
| ColumnHeaderRightTapped
| Lo mismo que Windows.UI.Xaml.UIElement.RightTapped
pero para los encabezados de columna en lugar de todo el DataGrid. Consulte también ContextRequestedForColumnHeader
. |
| ColumnHeaderWidthChanged
| Alternativamente, podría llamarse ColumnHeaderResized
. En los argumentos del evento, incluya una propiedad booleana que especifique si el usuario la modificó o si se modificó mediante programación. Obviamente, los argumentos del evento también deben especificar qué encabezado de columna se redimensionó / cambió. |
| SortOrderChanged
| Debe activarse cuando cambia la lista de encabezados de columna seleccionados. También se activa cuando cualquiera de las columnas seleccionadas cambia entre orden ascendente o descendente. En los argumentos de evento, incluya una propiedad booleana que especifique si el usuario cambió el orden de clasificación o si lo cambió mediante programación. Consulte también el evento preexistente Sorting
. Creo que se activará un nuevo evento SortOrderChanged
después de que se active el evento Sorting
, si no se cancela la clasificación. |
| Sorting
| Ya existe, pero considere agregar una propiedad booleana configurable en argumentos de evento que permita cancelar la solicitud de clasificación. Por ejemplo, es posible que la clasificación no sea válida o no se pueda realizar y deba cancelarse. También agregue una propiedad booleana para especificar si la ordenación fue solicitada por el usuario o mediante programación. |
| ColumnSortDirectionChanged
| Este evento podría crearse, pero podría ser innecesario si se crea el evento SortOrderChanged
mencionado anteriormente, si SortOrderChanged
también se activa cuando cambia la dirección de clasificación. |
| ColumnDisplayIndexChanged
| Ya existe, pero considere agregar una propiedad booleana (en argumentos de evento) que especifique si el usuario la modificó o si se modificó mediante programación. Además, documente por qué es necesario tener los eventos ColumnDisplayIndexChanged
y ColumnReordered
. Alternativamente, elimine uno de estos eventos. |
| ColumnReordered
| Ya existe, pero considere agregar una propiedad booleana que especifique si fue modificada por el usuario o modificada mediante programación. |
| SelectionChanged
| Ya existe, pero considere agregar una propiedad booleana (en argumentos de evento) que especifique si el usuario la modificó o si se modificó mediante programación. |
| CopyingRowClipboardContent
| Ya existe, pero considere agregar una propiedad booleana a los argumentos del evento que especifique si la operación se corta en lugar de copiar. Alternativamente, haga un evento separado para cortar. |
| CuttingRowClipboardContent
| No existe Considere la posibilidad de crear un evento que se active cuando el usuario intente cortar filas (mediante la tecla de acceso rápido control-X, el menú contextual o de otra manera). Alternativamente, cree la propiedad booleana antes mencionada que permitiría activar CopyingRowClipboardContent
para las operaciones de copia y corte |
| PastingRowClipboardContent
| No existe Considere la posibilidad de crear un evento que se active cuando el usuario intente pegar (mediante la tecla de acceso rápido control-V, el menú contextual o de otra manera). |
Creo que la característica más importante para mí sería la capacidad de manejar fácilmente un millón de filas o más, sin tener que cargar un millón de filas en la memoria. La interfaz ISupportIncrementalLoading no es lo suficientemente buena para esto, porque la barra de desplazamiento solo refleja cuántas filas ha cargado hasta ahora (no el recuento total), y para llegar a la fila 1 millón, tendría que seguir desplazándose hasta el final y cargar más y más datos, y espero no quedarme sin memoria. Pero si sé que tengo 1 millón de registros de datos, déjeme decirle a la cuadrícula de datos, y si me desplazo rápido o salto hasta el final, se me puede pedir que proporcione las últimas filas.
Piense en desplazarse por una lista de filas en una base de datos que incorporaré dinámicamente.
Creo que la característica más importante para mí sería la capacidad de manejar fácilmente un millón de filas o más, sin tener que cargar un millón de filas en la memoria. La interfaz ISupportIncrementalLoading no es lo suficientemente buena para esto, porque la barra de desplazamiento solo refleja cuántas filas ha cargado hasta ahora (no el recuento total), y para llegar a la fila 1 millón, tendría que seguir desplazándose hasta el final y cargar más y más datos, y espero no quedarme sin memoria. Pero si sé que tengo 1 millón de registros de datos, déjeme decirle a la cuadrícula de datos, y si me desplazo rápido o salto hasta el final, se me puede pedir que proporcione las últimas filas.
Piense en desplazarse por una lista de filas en una base de datos que incorporaré dinámicamente.
Esta.
'Moderna' significa liviana y rápida, y las aplicaciones empresariales comúnmente se tratan de clasificar toneladas de datos internos para encontrar y explorar los registros apropiados. Paginación, clasificación, carga incremental asincrónica, desplazamiento sin fin: todos estos son elementos básicos de las aplicaciones de escritorio que aprovechan las cuadrículas de datos.
MS debería producir una aplicación de muestra que destaque estas características en la nueva cuadrícula y recopilar comentarios de los desarrolladores empresariales a lo largo del tiempo para mejorar estas experiencias. Haga que se ejecute a partir de un gran conjunto de datos como World Wide Importers para demostrar su eficacia.
@dotMorten
Creo que la característica más importante para mí sería la capacidad de manejar fácilmente un millón de filas o más, sin tener que cargar un millón de filas en la memoria.
Yo también deseo eso. Para ayudar a admitir un millón de filas (y me refiero a ayudar, no necesariamente la solución completa), sugiero que DataGrid haga que su técnica actual de enlace de datos sea opcional. Creo que actualmente el enlace de datos es obligatorio (a menos que mi conocimiento ya no esté actualizado con la última versión de DataGrid). DataGrid no debería requerir el uso de Windows.UI.Xaml.Data.Binding
como la única forma admitida de recuperar los valores para cada celda / columna en cada fila visible.
Sugiero que DataGrid permita que las aplicaciones le den a DataGrid un delegado o instancia de interfaz que DataGrid invocará siempre que DataGrid necesite recuperar el valor de una celda / columna en una fila (alternativamente, este delegado o interfaz podría recuperar la fila completa - todos los valores de columna para una fila especificada).
Idealmente (si es posible), DataGrid permitiría que este delegado o interfaz funcione de forma asincrónica . Por ejemplo, el delegado o la interfaz pueden devolver un Task
o IAsyncOperation<TResult>
lugar de devolver inmediatamente el valor solicitado.
Alternativamente, el soporte asincrónico también es posible sin Task
y IAsyncOperation<TResult>
, si DataGrid funciona de manera similar al siguiente procedimiento:
Primero que nada, ¡guau! Muchas gracias a todos los que están contribuyendo con sus ideas. Tengo algunas respuestas específicas a continuación, pero en general, quería decir que estoy guardando un montón de estos comentarios y realmente disfruto escuchando cómo podemos construir un DataGrid moderno increíble. ¡Sigue viniendo!
@Pinox muchas gracias por esa respuesta detallada y las capturas de pantalla. Tu lista de deseos es increíble (¡especialmente esas animaciones geniales!). Estoy de acuerdo en que esas características que se encuentran en html son un buen punto de inspiración y son simples, pero mejorarían enormemente la calidad de vida. ¡Definitivamente guardaré este comentario para referencia futura!
@verelpode , @robloo , @ duke7553 ¡ SÍ a los eventos específicos de DataGrid! Gracias a todos por el detalle que pusieron en estos. Como diseñamos para tocar primero y para una variedad de entradas, ¡eventos como estos definitivamente deberían implementarse!
@dotMorten , @jkewley , @verelpode El rendimiento es definitivamente una de las principales motivaciones de este proyecto y una de las principales mejoras que queremos implementar, a través de una nueva historia de virtualización de datos y el uso de controles modernos como ItemsRepeater. Los mantendremos a todos actualizados una vez que tengamos más detalles, pero gracias nuevamente por estos detalles que ha sugerido.
@ Laz3rPanth3r , @robloo , @keeganatorr Lo escuchamos alto y claro acerca de que le gustan los DataGrids que pertenecen a WPF y otros marcos de interfaz de usuario. ¡Definitivamente estamos teniendo esto en cuenta en esta actualización!
¡Gracias por el gran trabajo en DataGrid y la solicitud de comentarios! Aquí hay algunas mejoras más sugeridas.
Las subclases / implementaciones actuales de DataGridColumn
son insuficientes. Sugiero crear las siguientes nuevas subclases de DataGridColumn
:
| Subclase propuesta | Descripción |
| : --- | : --- |
| DataGridIconColumn | Un requisito común es mostrar un ícono en cada fila de una lista, por lo tanto, sugiero hacer una subclase DataGridColumn
llamada DataGridIconColumn
que tipifique el valor de la celda recuperada en Windows.UI.Xaml.Controls.IconSource
y muestre el IconSource
instancia (se representa una instancia IconSource
en cada celda). |
| DataGridImageColumn | DataGridImageColumn
debería funcionar igual que el DataGridIconColumn
excepto que debería representar Windows.UI.Xaml.Media.ImageSource
lugar de Windows.UI.Xaml.Controls.IconSource
. |
| DataGridDateTimeColumn | Muestra la fecha y / o la hora, según la configuración. Escribe el valor de la celda en System.DateTimeOffset
o System.DateTime
(ambos compatibles) y lo convierte en texto para que se muestre en la celda. La conversión a texto debe controlarse formateando configuraciones / propiedades en la clase DataGridDateTimeColumn
. Obviamente, también se debe admitir la clasificación por fecha / hora. |
| DataGridTimeSpanColumn | Escribe el valor de la celda en System.TimeSpan
y lo convierte en texto para que se muestre en la celda. La conversión a texto debe controlarse formateando configuraciones / propiedades en la clase DataGridTimeSpanColumn
. Obviamente, la ordenación también debe ser compatible, y debe ordenar las instancias TimeSpan
, no el texto mostrado. |
| DataGridDataSizeColumn | Escribe el valor de la celda en System.Int64
, UInt64
, Int32
, o UInt32
(todos compatibles) y lo convierte en un tamaño en bytes (como texto ) para ser mostrado. Por ejemplo, 1572864 se mostraría como "1,5 MB" porque 1572864/1024/1024 = 1,5. La conversión a texto debe controlarse mediante configuraciones / propiedades en la clase DataGridDataSizeColumn
. La clasificación debe realizarse utilizando el valor entero original, no el texto mostrado. |
| DataGridCustomColumn | Esto debería funcionar de manera similar al DataGridTemplateColumn
preexistente excepto sin el Windows.UI.Xaml.DataTemplate
. Debería invocar un delegado / devolución de llamada o un evento para generar y / o actualizar el subárbol de elementos de la GUI mostrado. |
| DataGridTextColumn | Ya existe, pero considere agregar propiedades o eventos que permitan que las aplicaciones anulen la conversión de objeto a texto y la función de comparación para ordenar. Explico esto con más detalle más adelante en mi mensaje. |
DataGridCustomColumn
sería así:
public class DataGridCustomColumn : DataGridColumn
{
public event EventHandler<DataGridDisplayingCellEventArgs> DisplayingCell;
}
public class DataGridDisplayingCellEventArgs : EventArgs
{
public DataGridColumn Column { get; }
public object CellValue { get; }
public Windows.UI.Xaml.UIElement CellUIElement { get; set; } // settable
}
Cuando se activa el evento DataGridCustomColumn.DisplayingCell
, el controlador de eventos debe generar o actualizar su propio subárbol UIElement
para mostrar el DataGridDisplayingCellEventArgs.CellValue
, y establecer la propiedad DataGridDisplayingCellEventArgs.CellUIElement
a ese UIElement
subárbol, y luego DataGrid lo mostrará.
La próxima vez que DataGrid active este evento, DataGrid debe establecer la propiedad DataGridDisplayingCellEventArgs.CellUIElement
en la instancia UIElement
que fue previamente generada por el controlador de eventos, para permitir que el controlador de eventos se reutilice / recicle y actualice el mismo subárbol UIElement
(potencialmente con un valor diferente en DataGridDisplayingCellEventArgs.CellValue
). El controlador de eventos se permite que sea reciclar el mismo UIElement
subárbol O establecer la propiedad DataGridDisplayingCellEventArgs.CellUIElement
a un recién creado UIElement
subárbol.
También considere la posibilidad de hacer el nuevo evento DisplayingCell
directamente en la clase base DataGridColumn
, en lugar de hacer la subclase DataGridCustomColumn
. Por lo tanto, el evento DataGridColumn.DisplayingCell
podría permitir la personalización o anulación del UIElement
generado para cada subclase de DataGridColumn
.
En el DataGridTextColumn
preexistente, actualmente el valor / objeto de la celda se convierte en texto para su visualización invocando System.Object.ToString
. Considere realizar un delegado / devolución de llamada o un evento que permita que las aplicaciones anulen esta conversión de valor a texto. Considere también una propiedad que permite a las aplicaciones especificar una instancia System.Collections.IComparer
para anular el comportamiento de clasificación.
public class DataGridTextColumn : DataGridColumn
{
public System.Collections.IComparer Comparer { get; set; }
public DataGridCellValueToToStringConverter CellValueToToStringConverter { get; set; }
}
public delegate string DataGridCellValueToToStringConverter(object sourceObject);
Alternativamente, en lugar de hacer la propiedad Comparer
en DataGridTextColumn
, considere la posibilidad de hacer la propiedad Comparer
directamente en la clase base DataGridColumn
, para permitir apps para controlar el comportamiento de clasificación de todas las subclases de DataGridColumn
.
Del mismo modo, la propiedad CellValueToToStringConverter
también se podría hacer en la clase base DataGridColumn
porque sería útil tener la capacidad de convertir cualquier valor de celda en texto independientemente de la subclase de DataGridColumn
se utiliza. Por ejemplo, al copiar una fila al portapapeles, cada valor de celda podría convertirse en texto. (Tanto los formatos de texto como los que no son de texto pueden colocarse simultáneamente en el portapapeles; las aplicaciones suelen hacer esto para aumentar la compatibilidad con otras aplicaciones).
Volver a ordenar cuando se selecciona DataGridIconColumn
o DataGridImageColumn
: Obviamente, DataGrid no puede ordenar iconos o imágenes, por lo tanto, podría usar cualquiera de estas soluciones:
DataGridIconColumn
o DataGridImageColumn
.AlternativeText
propiedad en el IconSource
clase. Cuando DataGridIconColumn
ordena las filas, o cuando convierte la celda en texto para el portapapeles / copia, usaría la propiedad AlternativeText
.Comparer
configurable (de tipo System.Collections.IComparer
) en DataGridColumn
o DataGridIconColumn
.Considere mejorar la funcionalidad para obtener y configurar las filas / elementos seleccionados, porque la funcionalidad actual es insuficiente. Actualmente existen estas propiedades:
public int SelectedIndex { get; set; }
public object SelectedItem { get; set; }
public System.Collections.IList SelectedItems { get; }
Descubrí que a veces necesitaba acceso a las instancias de DataGridRow de las filas seleccionadas, por lo que espero que las siguientes propiedades se puedan agregar a DataGrid:
public DataGridRow SelectedRow { get; set; }
public IList<DataGridRow> SelectedRows { get; }
Alternativamente, si lo anterior es demasiado difícil de implementar, la siguiente variación de solo lectura es menos poderosa pero aún útil:
public DataGridRow SelectedRow { get; }
public IReadOnlyCollection<DataGridRow> SelectedRows { get; }
Si las instancias de DataGridRow pueden reciclarse , la documentación de las propiedades anteriores debe advertir que la información devuelta solo es válida temporalmente, por lo que debe leerse / usarse de inmediato y no conservarse durante un período de tiempo más prolongado.
Además, la propiedad SelectedIndex
preexistente da acceso a un índice seleccionado, pero ¿qué pasa con el acceso a todos los elementos seleccionados? Por lo tanto, sugiero hacer la siguiente propiedad SelectedIndexes
:
public IList<int> SelectedIndexes { get; } // Suggestion.
public int SelectedIndex { get; set; } // Already exists.
Personalmente, encuentro el nombre "SelectedIndex" confuso porque DataGrid se usa a menudo junto con una base de datos y el término "índice" tiene un significado completamente diferente en una base de datos, por lo que sugiero cambiar el nombre de las propiedades de la siguiente manera, pero espero que mi sugerencia de nomenclatura será rechazado:
public IList<int> SelectedOrdinals { get; }
public int SelectedOrdinal { get; set; }
También deseo tener la capacidad de desplazar el DataGridRow y / o DataGridColumn especificados a la vista. Actualmente existe este método:
public void ScrollIntoView(object item, DataGridColumn column);
Sugiero reemplazar el método ScrollIntoView
preexistente con estos 2 métodos:
public void ScrollIntoView(DataGridRow row, DataGridColumn column);
public void ScrollItemIntoView(object item, DataGridColumn column);
Cuando las aplicaciones se abren y cierran, necesitan la capacidad de guardar y restaurar la configuración del usuario final de DataGrid, incluido el orden de clasificación y otras configuraciones. Orden de clasificación que significa la lista de columnas que fueron seleccionadas por el usuario. Tenga en cuenta que esta es una lista, no una sola columna. Se puede seleccionar más de una columna simultáneamente, es decir, la columna principal para clasificar, la columna secundaria para clasificar y la columna terciaria para clasificar, etc.
Por lo tanto, la siguiente propiedad podría realizarse en DataGrid, pero en realidad esta es solo la primera idea y no es ideal:
public IReadOnlyList<DataGridColumn> SortOrder { get; set; }
Lo anterior no es ideal porque no admite guardar y restaurar el DataGridColumn.SortDirection
de cada columna en una sola visita . Me doy cuenta de que las aplicaciones pueden hacerlo en varios pasos:
SortOrder
en la lista de columnas seleccionadas.SortDirection
de cada una de las columnas seleccionadas (repita este paso para cada columna).Eso sigue siendo problemático porque tiene múltiples accesos, lo que significa que causa múltiples complejos de DataGrid que consumen mucho tiempo. Los usuarios finales podrían notar y sufrir un retraso significativo en un DataGrid que contiene una gran cantidad de filas, cuando el DataGrid se recurre varias veces innecesariamente. Para eliminar este problema, sugiero la siguiente solución que permite a las aplicaciones restaurar el orden de clasificación completo de un solo golpe y no causar más que un solo recurso.
public class DataGrid
{
public IReadOnlyList<DataGridColumnAndDirection> SortOrder { get; set; }
...
}
public struct DataGridColumnAndDirection
{
public readonly DataGridColumn Column;
public readonly DataGridSortDirection SortDirection;
public DataGridColumnAndDirection(DataGridColumn, DataGridSortDirection) { ... }
}
Tenga en cuenta que escribí deliberadamente IReadOnlyList<DataGridColumnAndDirection>
no IList<DataGridColumnAndDirection>
arriba porque las aplicaciones no deberían poder modificar la lista devuelta por la propiedad SortOrder
. En lugar de modificar la lista, las aplicaciones deben establecer la propiedad SortOrder
en una lista que DataGrid copiará y usará para reemplazar completamente la lista de orden de clasificación completa. Por lo tanto, funcionaría de un solo golpe y evitaría múltiples complejos turísticos costosos.
Cuando DataGrid.SortOrder
se establece en una nueva lista, DataGrid también establecería la propiedad DataGridColumn.SortDirection
en cada columna de la nueva lista SortOrder
, pero sin causar múltiples complejos turísticos. Por tanto, DataGrid.SortOrder[i].SortDirection
es equivalente a DataGridColumn.SortDirection
.
Cuando las aplicaciones se abren y cierran, necesitan la capacidad de guardar y restaurar el orden del usuario final de las columnas, preferiblemente de una sola vez. Sé que la propiedad preexistente DataGridColumn.DisplayIndex
es configurable, por lo tanto, teóricamente, las aplicaciones podrían restaurar la configuración del usuario final iterando a través de todas las columnas en DataGrid.Columns
y establecer el DisplayIndex
de cada una, pero esto podría causar errores. Por ejemplo, DisplayIndex
puede fallar o comportarse de manera inesperada cuando una aplicación necesita establecer temporalmente DisplayIndex
de una columna en el mismo DisplayIndex
de otra columna. Además, si no se realiza de una vez, podría desencadenar múltiples redibujos y / o recálculos costosos.
Por lo tanto, sugiero hacer una propiedad ColumnDisplayOrder
en DataGrid:
public IReadOnlyList<DataGridColumn> ColumnDisplayOrder { get; set; }
Lo mismo que mencioné anteriormente para SortOrder
, ColumnDisplayOrder
es deliberadamente IReadOnlyList<DataGridColumn>
no IList<DataGridColumn>
porque debería funcionar de una vez.
Cuando DataGrid.ColumnDisplayOrder
se establece en una nueva lista, DataGrid actualizará el DataGridColumn.DisplayIndex
de cada columna para que coincida.
De acuerdo con las propiedades preexistentes DataGridColumn.CanUserReorder
etc, sugiero hacer una propiedad CanUserChangeVisibility
en DataGridColumn
. Cuando DataGridColumn.CanUserChangeVisibility
es verdadero, el usuario final podría provocar cambios en la propiedad DataGridColumn.Visibility
.
Permita que se genere la GUI de detalles de fila sin requerir el uso de DataGrid.RowDetailsTemplate
( Windows.UI.Xaml.DataTemplate
). Para lograr esto, se debe pensar un poco en la API, pero esta es mi primera idea de cómo hacerlo: tal vez hacerlo a través del evento preexistente DataGrid.LoadingRow
cambiando la propiedad DataGridRowDetailsEventArgs.DetailsElement
para ser configurable para que el controlador de eventos pueda generar (o actualizar) el UIElement por sí mismo y dárselo a DataGrid configurando la propiedad DetailsElement
.
La razón por la que el uso obligatorio de Windows.UI.Xaml.DataTemplate
es un problema: aunque las plantillas son una buena característica, el concepto de plantilla espera un fragmento / documento XAML inmutable creado previamente que fue escrito por el desarrollador de antemano. Por lo tanto, las plantillas son un problema cuando la aplicación necesita generar dinámicamente la GUI en tiempo de ejecución. Por lo tanto, deseo las alternativas antes mencionadas a DataTemplate
.
Sugiero tener la capacidad de habilitar opcionalmente la función de arrastrar y soltar filas de salida. DataGrid implementaría la función de arrastrar pero no la de soltar. Cuando se produce la caída, DataGrid desencadenaría un evento y la aplicación responde al evento para realizar la acción deseada cuando la fila se coloca fuera de DataGrid.
También la capacidad de habilitar opcionalmente la función de arrastrar y soltar entrantes de filas o elementos / objetos. DataGrid aceptaría arrastrar y soltar entrantes, pero no implementa la colocación. DataGrid desencadenaría un evento cuando se suelta la fila / elemento / objeto, y la aplicación responde al evento para realizar la acción deseada cuando la fila se suelta dentro de DataGrid.
Tenemos una solicitud de función de un cliente que desea que se realicen celdas individuales (cambiando el color / pincel de fondo de la celda) en ciertos momentos (como cuando nuestra aplicación detecta cambios o valores importantes o valores peligrosos que exceden los límites de seguridad, etc.).
Por lo tanto, podría proponer una propiedad DataGridCell.Background
(de tipo Brush
), pero creo que esta forma de hacerlo probablemente sea defectuosa porque DataGrid recicla instancias DataGridCell
, ¿no? Así que supongo que hilitar celdas individuales estableciendo una propiedad DataGridCell.Background
sería una solución poco confiable.
Una mejor manera podría ser a través del evento DataGridColumn.DisplayingCell
que propuse en mi mensaje anterior. El controlador de eventos podría establecer una propiedad CellBackgroundBrush
en DataGridDisplayingCellEventArgs
.
Sé que "tonto" suena muy mal, pero en realidad me encantaría que DataGrid se hiciera tonto en el área de recuperación de datos (recuperación de los valores de celda que va a mostrar DataGrid).
Actualmente, DataGrid intenta realizar la recuperación de datos de una manera automática conveniente a través de su propiedad DataGrid.ItemsSource
más técnicas de enlace de datos (la propiedad DataGridBoundColumn.Binding
) e interfaces como System.ComponentModel.INotifyPropertyChanged
.
Sí, el enlace de datos es una característica conveniente, ¡pero en realidad prefiero que DataGrid haga _less_ en ese departamento! Varios componentes de Microsoft me causan grandes dificultades debido a su comportamiento de intentar ser inteligente pero en realidad terminan siendo demasiado inteligentes . En general, experimentaría menos dificultades y menos trabajo si estos componentes dejaran de intentar ser tan inteligentes / automáticos / convenientes. Al diseñar un comportamiento automático, considero que vale la pena tener en cuenta que automático suena muy bien, pero tiene el potencial de ser contraproducente.
_ "Simplemente déjame hacerlo yo solo". _
A veces, la mejor solución es simplemente permitir que las aplicaciones realicen la tarea por sí mismas, en lugar de intentar y no hacerlo "automáticamente" dentro de un componente como DataGrid. Desearía que DataGrid me permitiera realizar por completo la recuperación de datos por mí mismo, en lugar de intentar recuperar automáticamente los datos a través de las propiedades DataGridBoundColumn.Binding
y DataGrid.ItemsSource
.
Idealmente, me gustaría eliminar el requisito de usar la propiedad DataGrid.ItemsSource
para suministrar los artículos. @dotMorten mencionó un millón de filas. Actualmente, DataGrid hace obligatorio que las aplicaciones establezcan DataGrid.ItemsSource
, pero no es práctico crear un objeto de lista que contenga un millón de elementos. Por lo tanto, deseo que DataGrid deje de ser inteligente en el departamento de recuperación de datos y, en su lugar, me permita realizar la recuperación de datos por mí mismo, sin usar DataGridBoundColumn.Binding
y DataGrid.ItemsSource
.
@anawishnoff escribió:
El rendimiento es definitivamente una de las principales motivaciones de este proyecto y una de las principales mejoras que queremos implementar, a través de una nueva historia de virtualización de datos y el uso de controles modernos como ItemsRepeater.
Veo que dijo que la nueva historia de virtualización de datos mejorará el rendimiento, y eso es una buena noticia, pero ¿eliminará también el requisito de usar la propiedad DataGridBoundColumn.Binding
para proporcionar los valores de celda que muestra DataGrid?
Si todo el trabajo de recuperación de datos se subcontrata a la aplicación que usa DataGrid, entonces la aplicación tiene total flexibilidad para realizar la recuperación de datos de la manera que necesite. Esto permitiría muchos escenarios diferentes de recuperación de datos, incluido el millón de filas que mencionó @dotMorten . Hazlo tonto, por favor: sonríe:
La versión WPF de DataGrid tiene algunas características que parecen innecesarias o poco prácticas, y estas características podrían omitirse en WinUI DataGrid, pero espero que algunas personas probablemente tengan una opinión diferente sobre estas características.
¿Cuántas personas plantearían una objeción si WinUI DataGrid abandonara la función en la que los usuarios finales pueden editar valores de celda en línea / directamente dentro de DataGrid? En nuestro caso, en todos los lugares donde usamos DataGrid, siempre configuramos DataGrid.IsReadOnly
en verdadero para deshabilitar la función de edición en línea / directa. Permitimos a los usuarios editar la fila seleccionada en un panel o panel separado, o en RowDetails ( DataGrid.RowDetailsTemplate
), pero no directamente dentro del DataGrid.
Parece que WinUI DataGrid ya se ha movido en la dirección de eliminar el soporte para la edición en línea / directa porque WPF DataGrid tenía CanUserAddRows
y CanUserDeleteRows
pero estas propiedades ya no existen en WinUI DataGrid. ¿Por qué no ir hasta el final para eliminar por completo la función de edición en línea / directa? ¿Cuántas personas tienen objeciones a esta idea?
Selección de celda individual: WPF DataGrid tiene una propiedad SelectionUnit
que puede establecer en Cell
, FullRow
o CellOrRowHeader
. En nuestro caso, siempre lo configuramos en FullRow
y nunca encontramos la necesidad de configurarlo en Cell
. Sin embargo, veo que una persona aquí ya ha solicitado el modo de selección de celda única. Mi pregunta es si el modo de selección de celda es una solicitud común o rara.
Por otro lado, la selección de celdas individuales puede ser útil cuando el usuario copia filas / celdas en el portapapeles. Permitiría a los usuarios copiar una celda individual (o varias celdas contiguas) al portapapeles en lugar de copiar toda la fila. Sin embargo, no estoy seguro de si esta función es realmente valiosa o no.
| Característica dudosa en WPF | Comentarios |
| : --- | : --- |
| DataGrid.IsReadOnly
| ¿Quizás no hay necesidad real de establecer IsReadOnly en falso? |
| DataGrid.CanUserAddRows
| No existe en WinUI DataGrid. Ya abandonado, o quizás aún no implementado (no conozco el plan). |
| DataGrid.CanUserDeleteRows
| No existe en WinUI DataGrid. Ya abandonado, o quizás aún no implementado (no conozco el plan). |
| DataGrid.SelectionUnit
| No existe en WinUI DataGrid. |
Vaya, increíble discusión aquí. ❤️
También acepto la API de WPF DataGrid. El DataGrid de WPF es realmente el DataGrid que quiero para WinUI 3.0.
Pero incluso WPF DataGrid carece de algunas funciones. En el pasado, la mayoría de mis clientes usaban un DataGrid de terceros más poderoso para obtener estas funciones:
Pero de todos modos, hagas lo que hagas, creo que construir un DataGrid es una declaración poderosa y un compromiso con WinUI 3.0. Para las aplicaciones LOB, no puede tomarse en serio un marco de interfaz de usuario que no contenga un DataGrid integrado. ¡Y es genial ver esta inversión hecha para WinUI!
@thomasclaudiushuber
Para las aplicaciones LOB, no puede tomarse en serio un marco de interfaz de usuario que no contenga un DataGrid integrado. ¡Y es genial ver esta inversión hecha para WinUI!
¡Acordado! En nuestro caso, DataGrid es un componente fundamentalmente esencial que usamos en varios lugares y no podemos vivir sin él.
Potente visualización de datos jerárquicos. Algunos DataGrids de terceros realmente funcionan como un poderoso TreeView con DataGrids anidados.
Estoy dividido en ese tema porque, como usted, me parecería útil un DataGrid jerárquico en algunas situaciones, pero mi preocupación es que si DataGrid implementa la funcionalidad jerárquica, entonces podría volverse excesivamente complejo y difícil, y el lanzamiento de Lo más probable es que DataGrid se retrase sustancialmente. Sería difícil agregar nuevas características debido a la complejidad de hacer que las nuevas características sean compatibles con la funcionalidad jerárquica y no jerárquica.
Para eliminar el problema de complejidad / retrasos antes mencionado, sugiero esta solución: Cree una clase separada llamada HierarchicalDataGrid
que use / envuelva internamente una instancia de DataGrid
. Alternativamente, HierarchicalDataGrid
podría heredar públicamente DataGrid
pero sospecho que esta herencia no es práctica, por lo que prefiero sugerir que HierarchicalDataGrid
herede Control
e internamente tenga un campo privado de escriba DataGrid
. Por lo tanto, la funcionalidad jerárquica se implementaría en la capa HierarchicalDataGrid
que dirige una instancia interna DataGrid
no jerárquica.
La ventaja clave de la solución anterior es que ofrecería las características jerárquicas deseadas _ sin_ atascar DataGrid
, sin hacer que DataGrid
tan complejo que se vuelva inmanejable y lento de desarrollar.
Soporte para diferentes tipos de datos. Como, por ejemplo, una columna DateTime.
Estoy de acuerdo. Echa un vistazo a los DataGridDateTimeColumn
y DataGridTimeSpanColumn
que propuse en un mensaje anterior.
@Pinox
Filtra fácilmente toda la página
@thomasclaudiushuber
Filtros en los encabezados de columna; Una fila de filtro completa en la parte superior de DataGrid;
Los filtros serían excelentes para ayudar a los usuarios finales a encontrar rápidamente una fila o filas, en lugar de la situación actual de verse obligados a mirar manualmente una gran cantidad de filas para encontrar lo que están buscando.
Pero, ¿qué pasa con el problema de hacer coincidir el texto del filtro del usuario con columnas que no son de texto? ¿Significa columnas distintas a DataGridTextColumn
, como filtrar con DataGridTemplateColumn
etc.? Sugiero resolver esto con algo aproximadamente como la siguiente solución que le da a DataGridColumn
(y subclases) la capacidad de convertir un valor de celda en palabras clave para usar con búsqueda / filtrado / coincidencia.
public delegate void DataGridCellValueToKeywordsConverter(object cellValue, ICollection<string> outputKeywords);
public class DataGridColumn
{
...
public DataGridCellValueToKeywordsConverter CellValueToKeywordsConverter { get; set; }
/// <param name="cellValue">The input/source value of the cell, to be converted to keywords.</param>
/// <param name="outputKeywords">A collection that the method will add the keywords to. The method invokes ICollection.Add for each keyword.</param>
public virtual void ConvertCellValueToKeywords(object cellValue, ICollection<string> outputKeywords)
{
// Subclasses can override this method. The default behavior is to invoke the delegate to do the job.
DataGridCellValueToKeywordsConverter d = this.CellValueToKeywordsConverter;
if (!(d is null)) d(cellValue, outputKeywords);
}
}
A continuación, se muestra un ejemplo de cómo utilizar el método ConvertCellValueToKeywords
:
void TestKeywords(DataGridColumn column)
{
var keywords = new System.Collections.Generic.HashSet<string>();
foreach (object cellValue in someCellValueList)
{
keywords.Clear();
column.ConvertCellValueToKeywords(cellValue, keywords);
CheckIfFilterTextMatchesAnyKeyword(keywords);
}
}
Alternativamente, el valor de la celda podría convertirse en una sola cadena en lugar de una colección de palabras clave, pero la razón por la que sugerí una colección de palabras clave es que las palabras clave hacen posible el uso de algoritmos de búsqueda que se ejecutan a alta velocidad incluso cuando la cantidad de filas es muy grande.
Fácil copia pasada de Excel
Ahora no hay forma de usar ctrl + v para copiar el contenido de las celdas de Excel en la cuadrícula de datos. Ahora copia todo el contenido de las celdas en una celda en la cuadrícula de datos.
Proporcione una compatibilidad adecuada con varios elementos seleccionados, haciendo SelectedItems como una propiedad de dependencia para permitir el uso de enlace de datos al administrar filas seleccionadas.
@verelpode Puedo ver que la selección de celdas individuales es útil para cualquier aplicación de tipo de hoja de cálculo, ¿no? Creo que importa más en escenarios de edición que en escenarios de visualización. Al visualizar datos en una cuadrícula de datos sin editar, acepto que no vería un uso para la selección de celdas individuales y siempre tendré una selección de filas completa.
@anawishnoff Creo que @ Laz3rPanth3r estaría de acuerdo y el par de problemas aquí y aquí del kit de herramientas de que poder ingerir datos de manera fácil y simple en DataGrid es una característica importante. Debería poder arrancar la cuadrícula enlazándose a una colección de objetos o expandiendo objetos en una lista. Si puede seleccionar columnas de manera inteligente para números y cadenas y tipos de datos básicos, sería genial. El desarrollador siempre puede trabajar más después de personalizar columnas individuales más allá de eso.
Puedo ver que la selección de celdas individuales es útil para cualquier aplicación de tipo de hoja de cálculo, ¿no?
En una hoja de cálculo, los encabezados de las columnas se nombran con letras ascendentes del alfabeto, A, B, C, D, ... y el tipo de cada columna es el mismo, como si cada columna usara DataGridTextColumn
y ninguna otra columna se necesita el tipo, y los nombres de las columnas tampoco son realmente necesarios porque se generan automáticamente a partir del alfabeto.
Otra diferencia entre DataGrid y una hoja de cálculo es que una hoja de cálculo no ordena las filas cuando hace clic en cualquiera de los encabezados de columna.
Mi punto es que solo existe una similitud superficial (principalmente una similitud visual) entre DataGrid y una hoja de cálculo. DataGrid no funciona realmente como una hoja de cálculo. La técnica de recuperación de datos de celda de DataGrid tampoco es adecuada para una hoja de cálculo.
Me encanta DataGrid, pero funcionaría mal si intentara usarlo para implementar una hoja de cálculo. No creo que DataGrid sea la opción correcta para cualquiera que quiera implementar una hoja de cálculo.
El diseño existente de DataGrid se alinea mucho mejor con una base de datos SQL que con una hoja de cálculo, y los desarrolladores de bases de datos SQL gritarían fuerte si alguien intentara afirmar que una base de datos es "sólo una hoja de cálculo".
@verelpode Tus contribuciones son tan detalladas y pensadas, ¡muchas gracias por todo eso! Quiero hablar sobre la idea de vincular una fuente de datos / la propiedad ItemsSource de DataGrid, como mencionaste y @ michael-hawker también lo hizo.
Actualmente, DataGrid hace obligatorio que las aplicaciones configuren DataGrid.ItemsSource, pero no es práctico crear un objeto de lista que contenga un millón de elementos. Por lo tanto, deseo que DataGrid deje de ser inteligente en el departamento de recuperación de datos y, en su lugar, me permita realizar la recuperación de datos por mí mismo, sin usar DataGridBoundColumn.Binding y DataGrid.ItemsSource.
Esto es interesante y me gustaría profundizar más en él, ya que estamos realmente interesados en el rendimiento. ¿Qué tipo de situación / escenario de datos está buscando, específicamente? ¿Le gustaría conectar el DataGrid directamente al resultado de una consulta SQL, o una base de datos, o algo por el estilo?
@khoshroomahdi Al copiar y pegar, ¿quiere decir que desea copiar celdas de Excel en un DataGrid en una aplicación en ejecución y completar de esa manera? Ese es un caso de uso interesante, me gustaría escuchar más.
@alexyak , ¿podrías expandirte un poco más? La propiedad SelectedItems actualmente le permite obtener todos los elementos seleccionados en un DataGrid (aunque a través del modo de selección extendido, no precisamente del modo de selección múltiple). Veo en algunos otros comentarios aquí que la selección dentro de un DataGrid definitivamente necesita trabajo, pero quiero comprender mejor su solicitud.
@anawishnoff sí exactamente.
Tengo algunos datos en celdas excelentes y quiero copiarlos en la aplicación en ejecución.
Para escenarios no vinculados a datos, deberíamos ver cómo el control WinForms DataGridView, que escribí hace muchos años, admitía un modo virtual: https://docs.microsoft.com/en-us/dotnet/api/system. windows.forms.datagridview.virtualmode
Actualmente, DataGrid hace obligatorio que las aplicaciones configuren DataGrid.ItemsSource, pero no es práctico crear un objeto de lista que contenga un millón de elementos. Por lo tanto, deseo que DataGrid deje de ser inteligente en el departamento de recuperación de datos y, en su lugar, me permita realizar la recuperación de datos por mí mismo, sin usar DataGridBoundColumn.Binding y DataGrid.ItemsSource.
Estoy de acuerdo en que también estaría bien. Estoy pensando en algo como ListBox, donde puede agregar elementos manualmente o configurar ItemsSource. Dicho esto, en el pasado solo generaba una nueva DataTable que representa una vista parcial de la base de datos completa para implementar la paginación (que es un buen caso de uso para esto). A continuación, se puede establecer una vista de ese DataTable en ItemsSource. Entonces, aunque definitivamente creo que es bueno tener esto, no parece obligatorio para un alto rendimiento.
Con respecto a todos los comentarios que convierten el control en más o menos un subconjunto de Excel (r), creo que, desde el primer momento, el DataGrid debería admitir la selección de celdas y la edición por celda. Sin embargo, cosas como copiar / pegar entre aplicaciones externas deben ser manejadas por el desarrollador.
@alexyak Con respecto a su solicitud de convertir SelectedItems en una propiedad de dependencia real y enlazable, esto también sería excelente para restaurar el estado (la mayoría de mis solicitudes de funciones hasta ahora son para restaurar el estado de la vista). Creo que este es un problema de todo el marco, ya que no es compatible con ningún control de WinUI / UWP que yo conozca. Probablemente debería ser una solicitud de función general. Ver discusión aquí
@anawishnoff escribió:
Tus contribuciones son tan detalladas y pensadas, ¡muchas gracias por todo eso!
Gracias, me alegra saber que mis contribuciones son útiles para hacer que DataGrid sea aún mejor :)
¿Qué tipo de situación / escenario de datos está buscando, específicamente? ¿Le gustaría conectar el DataGrid directamente al resultado de una consulta SQL, o una base de datos, o algo por el estilo?
Eso sigue siendo demasiado inteligente. Este comportamiento inteligente evita que diferentes aplicaciones realicen la recuperación de datos de diferentes maneras. Las diferentes aplicaciones tienen circunstancias muy diferentes, por lo que el "mejor" sistema de recuperación de datos es diferente para diferentes aplicaciones; no existe un "mejor" único. Por ejemplo, algunas aplicaciones nunca muestran más de un par de cientos de filas, mientras que otras aplicaciones pueden funcionar con un millón de filas como mencionó @dotMorten , por lo tanto, una talla de zapato no sirve para todos.
Sugiero realmente simplificarlo a este nivel:
@RBrid escribió:
Para escenarios no vinculados a datos, deberíamos ver cómo el control WinForms DataGridView, que escribí hace muchos años, admitía un modo virtual:
¡Si si si! Nunca he usado WinForms DataGridView, pero acabo de leer la documentación ahora y creo que ha dado en el clavo. La página web a la que vinculó dice:
_ "El modo virtual está diseñado para su uso con grandes almacenes de datos". _
Veo que WinForms DataGridViewCellValueEventArgs contiene estas propiedades:
public int RowIndex { get; } // DataGrid sets RowIndex.
public int ColumnIndex { get; } // DataGrid sets ColumnIndex.
public object Value { get; set; } // The app sets Value.
Eso es excelente, excepto que, idealmente, debería actualizarse para admitir las palabras clave modernas C # async
y await
, o el equivalente de UWP ( IAsyncOperation<TResult>
), o más bien cualquier tipo de retraso de tiempo entre DataGrid que solicita el valor de la celda y la aplicación que entrega el valor de la celda a DataGrid. Por lo tanto, para actualizarlo para admitir async, haga lo siguiente:
SupplyCellValue
que la aplicación invocará, en lugar de ser requerido para establecer inmediatamente / sincrónicamente la propiedad DataGridViewCellValueEventArgs.Value
.El método SupplyCellValue
podría definirse así:
class DataGrid
{
public void SupplyCellValue(int rowIndex, int columnIndex, object value);
// Alternatively:
public void SupplyCellValue(int rowIndex, DataGridColumn column, object value);
}
Por lo tanto, en tiempo de ejecución, el procedimiento es:
DataGridViewCellValueEventArgs.RowIndex
en 9001 y DataGridViewCellValueEventArgs.ColumnIndex
en 5.DataGrid.SupplyCellValue
.Esta técnica simplificada es más poderosa y flexible que la técnica automatizada inteligente de DataGridBoundColumn.Binding
y DataGrid.ItemsSource
.
@alexyak , ¿podrías expandirte un poco más? La propiedad SelectedItems actualmente le permite obtener todos los elementos seleccionados en un DataGrid (aunque a través del modo de selección extendido, no precisamente del modo de selección múltiple). Veo en algunos otros comentarios aquí que la selección dentro de un DataGrid definitivamente necesita trabajo, pero quiero comprender mejor su solicitud.
Necesitamos un enlace de datos bidireccional adecuado para que los modelos de vista administren selecciones múltiples
@verelpode , habíamos modelado el modelo WinForms DataGridView a partir de los controles Win32 ComCtl32 aún más antiguos. En particular, estoy pensando en cómo el control de vista de lista usó el mensaje LVN_GETDISPINFO en modo virtual (consulte https://docs.microsoft.com/en-us/windows/win32/controls/list-view-controls-overview # handling-virtual-list-view-control-notification-codes y https://docs.microsoft.com/en-us/windows/win32/controls/lvn-getdispinfo). Cosas viejas de los 90.
De todos modos, creo que la forma en que se debe manejar el aspecto de recuperación de datos asincrónicos es a través de 'eventos diferidos'.
Los controles de WinUI ya usan eventos diferidos dos veces:
runtimeclass RefreshRequestedEventArgs
{
Windows.Foundation.Deferral GetDeferral();
}
runtimeclass TeachingTipClosingEventArgs
{
TeachingTipCloseReason Reason{ get; };
Boolean Cancel;
Windows.Foundation.Deferral GetDeferral();
}
Es el patrón que el nuevo evento CellValueNeeded de DataGrid querría adoptar. Permite que el controlador de eventos proporcione datos de forma asincrónica y le diga al control cuando haya terminado de hacerlo. Consulte https://docs.microsoft.com/en-us/uwp/api/windows.foundation.deferral.
@RBrid
Buen punto acerca de que GetDeferral()
es el nuevo patrón estándar. En este caso particular de CellValueNeeded
, parece mucho más difícil usar Deferral
que en otros casos / eventos. Corrígeme si me equivoco, pero creo que el problema con el uso de GetDeferral()
en este caso particular es que GetDeferral()
crea un nuevo objeto cada vez que se invoca, y esto daría lugar a una excesiva Se repite una gran cantidad de creación y limpieza de objetos para cada celda de cada fila de un número potencialmente grande de filas. No he visto el código fuente de varias implementaciones de GetDeferral()
, por lo que podría estar equivocado al respecto.
En otras palabras, a menos que Deferral
apoye el reciclaje o tenga una forma de hacer que GetDeferral()
mucho más eficiente, entonces sigue siendo demasiado inteligente. Mi propuesta simplificada con el método SupplyCellValue
evita incurrir en la sobrecarga de crear, completar y eliminar una nueva instancia Deferral
para cada celda de cada fila aplicable.
GetDeferral()
La tarea de recuperar un valor de celda no es la única tarea de administración de datos que puede subcontratarse a la aplicación. La clasificación también podría subcontratarse. Por lo tanto, valdría la pena considerar pensar en una interfaz en lugar de un solo evento CellValueNeeded
. Una aplicación le daría a DataGrid un módulo de gestión de datos en forma de objeto que implementa una determinada interfaz. DataGrid invocaría esta interfaz para recuperar valores de celda, pero también potencialmente otras tareas como la clasificación.
Para admitir el millón de filas que mencionó @dotMorten , CellValueNeeded
sí solo no resolvería el otro problema que ocurre cuando el usuario hace clic en el encabezado de una columna y DataGrid intenta ordenar un millón de filas. Por lo tanto, la recuperación Y clasificación de celdas podría subcontratarse a la aplicación a través del módulo / interfaz mencionado anteriormente.
Si la aplicación no proporciona ningún módulo / objeto de gestión de datos a DataGrid, lo ideal es que DataGrid utilice un módulo de gestión de datos predeterminado. Por lo tanto, todo el código de enlace de datos existente en DataGrid se movería de DataGrid a una nueva clase separada: la clase que implementa el módulo de administración de datos predeterminado al trabajar con DataGridBoundColumn.Binding
etc.
es decir, cuando la clasificación también se subcontrata a la aplicación o su módulo de gestión de datos, esto abre la puerta a varias soluciones que admiten un millón de filas, como escribir un módulo de gestión de datos que indique al servidor SQL que realice la clasificación, en lugar de intentar- y no ordenar un millón de filas dentro de DataGrid en menos de 10 o 20 horas después de que el usuario hace clic en el encabezado de la columna para comenzar la ordenación.
@verelpode , sí, esa es una preocupación válida. Esperaría que DataGrid posea un grupo de objetos Windows.Foundation.Deferral reciclables. Necesitaríamos confirmar la viabilidad y el rendimiento con seguridad.
Habiendo tomado una dependencia en el DataGrid del kit de herramientas de la comunidad de Windows que tiene detalles de fila como una característica (aunque con un error de rendimiento grave pero con una solución alternativa), realmente nos gustaría que esta nueva cuadrícula de datos también tuviera eso como una característica, con la misma opción para tener varios detalles de fila al mismo tiempo. Utilizándolo para un escenario de transmisión de datos de servidor a cliente.
Con un millón de filas frente a una GUI de paginación , @robloo escribió:
Estoy de acuerdo en que [apoyar un millón de filas] también sería bueno. .... Dicho esto, en el pasado solo generaba una nueva DataTable que representa una vista parcial de la base de datos completa para implementar la paginación (que es un buen caso de uso para esto). A continuación, se puede establecer una vista de ese DataTable en ItemsSource. Entonces, aunque definitivamente creo que es bueno tener esto, no parece obligatorio para un alto rendimiento.
La paginación es una técnica útil y que vale la pena mencionar, pero tiene desventajas sustanciales: hace que la función de clasificación de DataGrid sea prácticamente inútil. Lo mismo ocurre con una función de filtrado en la próxima versión de DataGrid. La paginación hace que la clasificación y el filtrado sean inútiles o, al menos, mucho menos útiles.
Por ejemplo, imagine que 2 o 3 columnas son columnas de fecha y el usuario desea ver las filas que tienen la fecha más reciente (o la más antigua) en la segunda columna de fecha. Por lo tanto, el usuario hace clic en el encabezado de la columna de la segunda fecha para ordenar el DataGrid por esa columna, y también hace clic para cambiar la dirección de clasificación de descendente a ascendente o viceversa. Esto funciona muy bien si no hay paginación en uso, o si la cantidad total de filas es lo suficientemente pequeña como para no exceder una sola página, pero se rompe si existen varias páginas.
El usuario debe encontrar la fecha más reciente (o más antigua) en todas las filas, pero una GUI de DataGrid paginada solo muestra la fecha más reciente (o más antigua) en la página actual, no en todas las filas, por lo que la paginación hace que la clasificación (y el filtrado) sea prácticamente inútil.
Esto plantea la cuestión de qué filas caen en qué página. La respuesta es que cada página normalmente contiene un subconjunto prácticamente aleatorio de filas, cuando las páginas / filas se obtienen mediante una consulta SQL SELECT
que no usa ORDER BY
. (Me refiero al azar desde el punto de vista del usuario, no verdaderamente al azar).
El pseudoaleatorio no es útil para los usuarios finales. Para eliminar esta aleatoriedad problemática, podríamos pensar en usar SQL ORDER BY
(junto con la palabra clave ASC
o DESC
para controlar la dirección de clasificación), y luego sí, las páginas son no más aleatorio, pero aún está roto porque este uso de ORDER BY
siempre se ordena por la misma columna y la misma dirección de clasificación, lo que significa que el orden de clasificación es frecuentemente diferente al orden de clasificación elegido por el usuario final que hace clic en una columna encabezado en DataGrid.
Para solucionarlo, deberá utilizar una consulta SQL diferente cada vez que el usuario haga clic en un encabezado de columna diferente. El SQL ORDER BY ... ASC/DESC
debería mantenerse igual que cualquier orden de clasificación elegido por el usuario final de DataGrid. DataGrid no admite esto actualmente.
Una solución sugerida está en mi mensaje anterior : sugerí que DataGrid debería permitir que la clasificación se subcontrate a la aplicación (oa un "módulo de administración de datos"). Esta idea haría posible que la aplicación (o "módulo de gestión de datos") cambie el SQL ORDER BY ... ASC/DESC
siempre que el usuario final cambie el orden de clasificación de DataGrid haciendo clic en los encabezados de las columnas, etc.
También podría valer la pena darle al evento preexistente DataGrid.Sorting
una propiedad configurable en los argumentos del evento que permita a las aplicaciones (el controlador de eventos) cancelar la clasificación y tomar el control. Idealmente, los argumentos del evento también especificarían si el cambio de orden de clasificación se solicitó mediante programación o si el usuario final hizo clic en los encabezados de las columnas, etc. En este caso, también podría ayudar cambiar el nombre del evento DataGrid.Sorting
a algo menos ambiguo porque actualmente la intención y el propósito del evento Sorting
no están claros. Vea también el evento propuesto
Habiendo tomado una dependencia en el DataGrid del kit de herramientas de la comunidad de Windows que tiene Row
Detalles como una característica (aunque con un error de rendimiento grave pero con una solución), lo haríamos
Me gusta mucho esta nueva cuadrícula de datos para tener eso como una característica también, con la misma opción para tener
varios detalles de filas al mismo tiempo. Utilizándolo para un escenario de transmisión de datos de servidor a cliente.
Enlace al problema de rendimiento de Detalles de fila: https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/2842
Repro: https://github.com/observito/DataGridRowDetailsPerfTest
Un buen punto de partida es mirar a su socio Telerik con su RadDataGrid (UWP Open Source). Con uno de mis clientes, lo usé y realmente funciona bien. Es muy rápido y versátil. Lo único que es difícil es su código, no hay forma de modificar nada de su motor sin una buena comprensión de la arquitectura.
Esperaría que el nuevo DataGrid tenga el mismo rendimiento que Telerik.
Las características de la cuadrícula de syncfusion son excelentes, pero no son compatibles con mvvm. Entonces podrías hacerlo mejor.
¡Hola de nuevo todos! Sigamos con esta conversación. ¿Qué piensa sobre la documentación de DataGrid que existe actualmente?
Aquí hay un enlace a la página de documentación principal que enlaza con todas las demás páginas relevantes.
Si creamos un nuevo DataGrid, queremos asegurarnos de que la documentación que lo acompaña sea de primera, fácil de entender y aborde todos los problemas y escenarios que son importantes para nuestros desarrolladores.
_ ¿Cuáles son algunos de los temas que desearías que tuviéramos? ¿Cuáles son algunos temas que podrían aclararse? _
¡Hola de nuevo todos! Sigamos con esta conversación. ¿Qué piensa sobre la documentación de DataGrid que existe actualmente?
Aquí hay un enlace a la página de documentación principal que enlaza con todas las demás páginas relevantes.
Si creamos un nuevo DataGrid, queremos asegurarnos de que la documentación que lo acompaña sea de primera, fácil de entender y aborde todos los problemas y escenarios que son importantes para nuestros desarrolladores.
_ ¿Cuáles son algunos de los temas que desearías que tuviéramos? ¿Cuáles son algunos temas que podrían aclararse? _
Las imágenes que muestren configuraciones típicas de DataGrid, junto con el xaml y el código para hacerlas, serían útiles.
Las imágenes que muestren configuraciones típicas de DataGrid, junto con el xaml y el código para hacerlas, serían útiles.
@mdtauk ¿Hay alguna configuración específica de DataGrid que le
Las imágenes que muestren configuraciones típicas de DataGrid, junto con el xaml y el código para hacerlas, serían útiles.
@mdtauk ¿Hay alguna configuración específica de DataGrid que le
Creo que para el período de tiempo de WinUI 3.0, que muestra escenarios comunes de vista de icono / cuadrícula de datos de WPF, Win32. Además de lo que Microsoft considera diseños de interfaz de usuario de DataGrid Fluent / Modern.
Eso es si la idea detrás del control es alentar el paso de las IU antiguas a WinUI 3
@anawishnoff Creo que algunas de las preguntas que teníamos del kit de herramientas en términos de cosas que la gente buscaba documentación sobre dónde estaban más de estos escenarios también:
Noté que el Toolkit DataGrid existente requiere un IEnumerable para su propiedad ItemsSource. Si bien esto parece una decisión lógica, hace que configurar el objeto devuelto por Windows.Storage.BulkAccess.FileInformationFactory.GetVirtualizedItemsVector () como esta propiedad sea imposible. (A menos que haya una forma de convertir el objeto devuelto) Además, otros controles como ListView y GridView admiten la configuración de su propiedad ItemsSource en un valor del tipo de objeto. No estoy seguro, pero admitir esto probablemente permitiría una interfaz de usuario más receptiva durante las operaciones de almacenamiento.
@mdtauk ¿Hay alguna configuración específica de DataGrid que le
Creo que para el período de tiempo de WinUI 3.0, que muestra escenarios comunes de vista de icono / cuadrícula de datos de WPF, Win32. Además de lo que Microsoft considera diseños de interfaz de usuario de DataGrid Fluent / Modern.
Eso es si la idea detrás del control es alentar el paso de las IU antiguas a WinUI 3
Ejemplo de Win32 (Explorador de archivos)
Ejemplo de WPF
Ejemplo de telaraña
Ejemplo de UWP
@mdtauk ¡ Gracias por esas capturas de pantalla! Definitivamente creo que es importante resaltar los elementos clave que han funcionado en versiones anteriores del control y documentar cómo se pueden lograr con el nuevo control.
@ michael-hawker Impresionante. Ya veo algunos temas allí que se han mencionado varias veces en este hilo, por lo que definitivamente son un buen lugar para comenzar.
@ duke7553 No estoy 100% seguro de una solución a eso, o si sería prudente admitir un tipo de objeto. ¿Quizás @RBrid pueda
@anawishnoff & @ duke7553 , construiría el nuevo control DataGrid sobre el nuevo control WinUI ItemsRepeater. Y ese control expone su ItemsSource como un Objeto:
Object ItemsSource { get; set; };
Espero que sea compatible con CellDecorationStyleSelector como en Telerik.
@anawishnoff
estamos interesados en graduarlo a un control nativo de WinUI
hmmmm, cuando dices "graduarse", ¿eso incluiría rebajarlo a C ++? Actualmente, el DataGrid de WinUI está escrito en C #. Espero que "graduado" no signifique "rebajar". Es importante destacar que WinUI necesita llegar a un punto en el que el equipo de WinUI pueda decir que WinUI es mejor que WPF en todos los aspectos importantes, pero este objetivo está muy atrasado. Este objetivo se retrasará aún más si se desperdician tiempo / recursos en degradaciones innecesarias de código como DataGrid de C # a C ++.
Aunque originalmente existía una razón para escribir WinRT / UWP / WinUI en C ++, desafortunadamente esa razón no llegó a buen término, y Google / Android tomó la mayor parte del mercado de teléfonos inteligentes, por lo tanto, la razón original para usar C ++ ya no es aplicable (fácilmente dicho en retrospectiva, pero no tan fácil de decir antes). Si WinUI se escribió en C # desde el principio, entonces el objetivo mejor que WPF se habría logrado hace 3 años, pero ahora son 8 años y aún no se ha logrado, y nadie puede decir con precisión cuándo se alcanzará el objetivo. Es de esperar que el objetivo mejor que WPF y los objetivos de "graduación" de WinUI DataGrid no se retrasen por una conversión innecesaria a un lenguaje de programación más antiguo y menos productivo.
Estoy predispuesto a favor de C ++ porque comencé a programar en C ++ antes de que existiera C #, y la gente prefiere seguir con lo que aprendieron originalmente y recordar con cariño _ "los buenos viejos tiempos" _. A pesar de mi sesgo a favor de C ++, dejé de escribir C ++ y creo que DataGrid no debería ser degradado a C ++ y retrasado. Déjelo como C # y concéntrese en cosas más importantes, como realizar las diversas mejoras sugeridas por las personas en este problema, y lograr el objetivo mejor que WPF antes de que se alcance 1 década.
Amo muchos aspectos de WinUI, y aprecio las muchas mejoras inteligentes en él, y escribo el código de la aplicación para WinUI, pero ¿quieres saber la verdad honesta? La verdad es que, lamentablemente, todavía no he lanzado ninguna aplicación WinUI a los usuarios. El software lanzado a los usuarios está escrito con WPF, y a los usuarios no les importa porque el software funciona bien e incluye modernizaciones de GUI. Aunque he escrito un montón de código de aplicación para WinUI, todo es preparación, planificación, prueba, espera, no en uso por parte de los usuarios. Es de esperar que el próximo año se lance a los usuarios el primer componente de WinUI, pero agradeceré mucho más este cambio que ellos. Los usuarios apenas notarán el cambio, si todo va según lo planeado.
Desde el punto de vista de Microsoft, WinRT / UWP es un software de calidad de lanzamiento, publicado para los usuarios desde el año 2012, pero desde mi punto de vista, UWP sigue siendo un gran experimento. Para mí, UWP (incluido WinUI) es una gran versión de prueba beta con la que he estado jugando durante años.
Durante los primeros años de UWP, todos los años pensaba: _ "errr ... esperaré hasta el próximo año. Todavía hay demasiadas cosas en WPF que faltan en UWP. Seguramente el próximo año será mejor". _
Luego llegó el año siguiente y repetí el mismo pensamiento. Luego llegó el año siguiente y repetí el mismo pensamiento. Ojalá este año sea el último de decir eso, o al menos esa es mi intención.
WinUI no puede permitirse más retrasos. Deje el DataGrid de WinUI como código C #. Comience a escribir más código WinUI en C # para aumentar la productividad. Han pasado 8 años y Android ha ganado una cuota de mercado masiva. Esa es una situación grave.
Por cierto, en realidad estaba siendo amable / generoso cuando dije que UWP todavía es una versión beta, porque técnicamente UWP coincide con la definición de una versión alfa, no beta. Para ser una verdadera versión beta, debe tener todas las funciones, pero UWP aún no ha alcanzado el estado de función completa, por lo que UWP sigue siendo alfa. Por ejemplo, el artículo de Wikipedia "Ciclo de vida de la versión de software" dice:
"La fase beta generalmente comienza cuando las funciones del software están completas, pero es probable que contenga una serie de errores conocidos o desconocidos".
"Es posible que el software Alpha no contenga todas las funciones previstas para la versión final".
Wikipedia define "característica completa" de la siguiente manera:
"Una versión completa de funciones de una pieza de software tiene todas sus funciones planificadas o primarias implementadas, pero aún no es definitiva debido a errores, problemas de rendimiento o estabilidad. Esto ocurre al final de las pruebas alfa de desarrollo".
No sería razonable describir UWP como con todas las funciones porque si realmente tiene todas las funciones, entonces UWP debe tener todas las capacidades de Windows '95 y más, pero no las tiene: UWP aún no supera a Windows 95 en todas las áreas. . Windows 95 se lanzó hace 25 años. Cuando se lanzó UWP / WinRT hace 7-8 años, Microsoft sufrió una pérdida de $ 900 millones y una falta paralizante de aplicaciones en la Tienda Windows. Era una versión alfa etiquetada como versión de lanzamiento, por lo que los desarrolladores de aplicaciones esperaron y observaron. Hoy, casi 8 años después, todavía es una versión alfa y muy atrasada, y todavía estoy esperando y mirando y esperando.
Sería muy beneficioso para Microsoft y los desarrolladores si Microsoft tomara una decisión o un compromiso serio para priorizar la producción de una verdadera versión beta de UWP, para ser seguida rápidamente por una verdadera versión Release Candidate. Esto sería muy recomendable y un curso de acción muy sensato. Sería excelente para todos.
UWP todavía es alfa / incompleto por varias razones, por ejemplo: hace 25 años, era fácil usar la función "MoveFile" en Windows 95 para mover un archivo o carpeta (aunque la función se llamaba "MoveFile", admitía ambos archivos y carpetas). ¿UWP puede mover carpetas? No aún no. Obviamente, la capacidad de mover carpetas es una de las características esenciales básicas fundamentales, pero a UWP todavía le falta esta característica esencial y otras, por lo tanto, no sería razonable describir UWP como característica completa, por lo tanto, UWP aún no ha alcanzado el estado beta, a pesar de siendo lanzado hace 7-8 años. Microsoft debe priorizar una verdadera versión beta de UWP.
Hasta donde yo sé, todavía no existe un repositorio público de GitHub para rastrear problemas de UWP (que no sean problemas de IU) (o si existe un repositorio de UWP, no pude encontrarlo). Nuevamente, esto coincide con la definición de una versión alfa porque a menudo no se desea un repositorio público de seguimiento de problemas durante una etapa alfa. Si fuera una verdadera versión beta o de lanzamiento, entonces ya se habría abierto un repositorio público de seguimiento de problemas, y UWP incluiría todas las características de Windows 95 y Windows 7, y más.
¿Cómo afecta esta situación a DataGrid ? Teniendo en cuenta que una versión beta con todas las funciones de UWP está terriblemente atrasada, y considerando la gravedad de esta situación y la pérdida multimillonaria que Microsoft ha sufrido como resultado, no sería justificable y razonable perder aún más tiempo. convirtiendo WinUI DataGrid a código no administrado y un lenguaje de programación más antiguo. Microsoft dijo repetidamente que una gran ventaja de C # y el "código administrado" es una mayor productividad, y puedo decir que las afirmaciones de Microsoft sobre el "código administrado" eran definitivamente ciertas en mis experiencias tanto con C ++ como con C #. UWP habría alcanzado el verdadero estado beta hace varios años si se hubiera escrito principalmente con código administrado a partir de la versión 1.0. Así que espero que la situación no empeore aún más al realizar más de estas degradaciones innecesarias de código administrado a código no administrado.
A modo de comparación, la mayor parte de WPF se completó con éxito en los 4 años de 2006 a 2010. WPF es principalmente código administrado, a diferencia de UWP. UWP es un código no administrado y después de 8 años de desarrollo, Windows 95 todavía supera a UWP en algunas áreas, por lo que Microsoft estaba claramente en lo cierto cuando Microsoft afirmó que el código administrado aumenta la productividad. Este problema debe resolverse lo antes posible. WinUI debería haber sido mucho más fácil / rápido de crear que WPF porque ambos proyectos tienen el mismo propietario (Microsoft), por lo que WinUI puede copiar libremente el código de WPF. Por lo tanto, WinUI debería haber requerido aproximadamente la mitad del tiempo de desarrollo de WPF. En realidad, WinUI nunca debería haberse iniciado, sino que Microsoft debería haber desarrollado las funciones de WinUI en nuevas versiones de WPF; WinUI debería haber sido WPF 5.0. Entonces, la situación era un gran lío y sería muy beneficioso para Microsoft priorizar la limpieza restante de este lío y dejar de hacer cosas que hacen que el error multimillonario sea aún peor de lo que ya era (y todavía lo es cuando miras en la situación actual de cuota de mercado de teléfonos inteligentes).
Esto significa que, para evitar aún más pérdidas, Microsoft se beneficiaría recordando lo que Microsoft ya dijo / sabía en el pasado:
@anawishnoff
estamos interesados en graduarlo a un control nativo de WinUI
Consulte también el artículo de Wikipedia "Costo hundido" :
El efecto del costo hundido (o efecto Concorde) es el hecho de que el comportamiento a menudo sigue a la falacia del costo hundido; la gente demuestra "una mayor tendencia a continuar un esfuerzo una vez que se ha realizado una inversión en dinero, esfuerzo o tiempo". Este comportamiento puede describirse como "arrojar buen dinero tras el mal", y negarse a sucumbir a él puede describirse como "reducir las pérdidas".
Y de manera similar "Sesgo de continuación del plan" :
El sesgo de continuación del plan, get-there-itis o press-on-itis es una tendencia imprudente a persistir con un plan que está fallando. Este es un peligro peligroso para los capitanes de barco o pilotos de aeronaves que pueden ceñirse a un rumbo planificado incluso cuando conduce a un desastre fatal y deberían abortar en su lugar. ..... Los proyectos a menudo sufren sobrecostos y retrasos debido a la falacia de la planificación y factores relacionados, incluido el optimismo excesivo, la falta de voluntad para admitir el fracaso, el pensamiento grupal y la aversión a la pérdida de costos hundidos.
WinRT / UWP hizo que Microsoft sufriera una pérdida de $ 900 millones en el primer o segundo año y una tienda de aplicaciones vacía durante demasiado tiempo. WinRT / UWP fue una falla catastrófica, por lo que debería haberse cancelado en el segundo año, pero continuó debido al "sesgo de continuación del plan" y la aversión a la pérdida de costos irrecuperables. Este material se enseña en cursos de gestión. ¿La continuación del plan eventualmente borró o revirtió la falla catastrófica de WinRT / UWP? No, sigue siendo una falla catastrófica hoy si se mira en términos de la cuota de mercado de teléfonos inteligentes. Esas descripciones en Wikipedia describen con precisión la situación de UWP.
Hoy en día, todos tenemos que estar de acuerdo en que en el momento actual, 7-8 años después del lanzamiento de WinRT / UWP, es demasiado tarde para cancelar UWP, pero esto significa que volvemos a ser víctimas del "sesgo de continuación del plan "y aversión a la pérdida de costes hundidos.
Entonces, ¿qué se puede hacer razonablemente para rescatar la situación? No podemos rescatar la situación cancelando UWP, aunque definitivamente debería haberse cancelado hace años. Lo que podemos hacer es esto: Aceptar el daño gigantesco que hizo WinRT, pero no causar más daño, y realizar cambios en los procedimientos / políticas del proyecto. Esto significa que deje de repetir / continuar los mismos errores catastróficos de WinRT. Por ejemplo, deje de degradar cantidades tan grandes de código administrado a código "nativo" antiguo no administrado e improductivo. El retraso en alcanzar el verdadero estado beta ya es muy grande, ¿por qué empeorar el retraso?
El error de "sesgo de continuación del plan" / costo hundido continúa si DataGrid se degrada a código "nativo" no administrado. Cuando se comete un error catastrófico como WinRT / UWP, se vuelve mucho peor cuando este mismo error se repite una y otra vez. Para limitar el daño, es necesario dejar de repetir el mismo error. Ha llegado el momento de aprender del catastrófico fracaso de WinRT y empezar a aplicar vendajes para detener la pérdida de sangre en curso.
Convertir DataGrid a código no administrado es lo mismo que ir a una biblioteca y tomar prestados los mejores libros de administración de proyectos de los mejores autores con el mayor conocimiento / experiencia, y luego arrojar todos estos excelentes libros de administración a una hoguera y verlos arder.
@verelpode Tengo curiosidad por saber cuál es su punto aquí con sus dos publicaciones muy grandes wrt DataGrid. Personalmente, no entiendo realmente qué es la retroalimentación anterior específicamente para mejorar un control OOB DataGrid. Lo único que recibí fue que te preocupa que sea una pérdida de tiempo convertirlo a código nativo, pero eso no se dirige a aquellos que usan WinUI desde C ++. Aún puede usar la implementación administrada actual si está de acuerdo con la sobrecarga de cargar el tiempo de ejecución administrado. Todo lo demás parece tener que ver con WinRT y el modelo de aplicación para UWP, ninguno de los cuales se aplica realmente a WinUI, ya que se está separando completamente de eso con v3.
@dotMorten : la razón por la que escribí detalles adicionales en esos mensajes es porque si no explico el problema de manera adecuada, la gente no lo entenderá. Pero lamentablemente ahora veo que el detalle extra falló y todavía no se entendió de todos modos. Eso es muy frustrante. Esta es la razón por la que muchas personas ni siquiera se molestan en escribir comentarios, porque creen que no tiene sentido tratar de explicar este tipo de problemas a las personas, e incluso si el mensaje se entiende con éxito, entonces es la naturaleza humana disparar al persona que da las malas noticias, por lo que es mejor no decir nada en absoluto, o simplemente sonreír "cortésmente" mientras piensa lo contrario.
ya que se está separando completamente de eso con v3.
Esta desvinculación v3 no evita la repetición de los mismos errores. El "sesgo de continuación del plan" todavía existe.
Vaya a la página de inicio de Microsoft:
https://www.microsoft.com/en-us/
Ahora desplácese hacia abajo en la página de inicio hasta que vea Windows Phone. ¡Oh! ¡Mira eso! ¡Hemos llegado al final de la página de inicio y Windows Phone no se menciona EN NINGÚN LUGAR de la página de inicio de Microsoft! ¿Qué significa esto? Significa despertar. Significa que UWP fue un fracaso catastrófico como dije. Significa que es importante dejar de repetir los mismos errores que llevaron al fracaso de UWP. Significa, cambiar el plan para rescatar y recuperarse del desastre.
Sería un error de administración si WinUI y DataGrid continúan repitiendo los mismos errores que en la falla de UWP.
"En mayo de 2016, Microsoft destruyó su negocio móvil ... En 2017, el ejecutivo de Microsoft, Joe Belfiore, reveló que Microsoft había dejado de desarrollar nuevos teléfonos con Windows y nuevas funciones para Windows 10 Mobile, citando las pérdidas en la participación de mercado y la falta de desarrollo de aplicaciones ".
- https://en.wikipedia.org/wiki/Microsoft_Mobile
Ana enumera 5 puntos para proporcionar comentarios sobre wrt DataGrid. ¿Cuál de esos puntos estás comentando? Supongo que eso es lo que no entiendo de lo que estás escribiendo. UWP no satisface las necesidades de todos, pero WinUI3 no dicta el uso del modelo de aplicación UWP, y ¿parece que usted está mayormente en contra de UWP? Entonces deberías estar bien allí.
Mencionaste que DataGrid no debería seguir cometiendo los mismos errores que cometió. Entonces, ¿cuáles son esos errores específicamente relacionados con el DataGrid existente y cómo sugiere que se corrijan? (aparte de que no quiere que se implemente en C ++ por alguna razón)
@dotMorten
Ana enumera 5 puntos para proporcionar comentarios sobre wrt DataGrid. ¿Cuál de esos puntos estás comentando?
La parte donde cité a Ana al comienzo de mi mensaje. Estoy comentando la parte del mensaje de Ana que cité al principio de mi mensaje.
WinUI3 no dicta el uso del modelo de aplicación para UWP
Eso no está relacionado con mi mensaje. El hecho de que WinUI 3 no esté vinculado y esté disponible a través del paquete nuget es irrelevante para la pregunta de si WinUI 3 continúa con los mismos errores de administración que llevaron al fracaso de UWP y Windows Phone y la pérdida multimillonaria de Microsoft.
¿Cómo sugiere que se corrijan?
Las 6 viñetas al final de mi mensaje anterior . El segundo punto (secuencias de comandos) se relaciona con WinUI y UWP en general, pero no se relaciona con DataGrid. El primer punto es el más importante si pregunta específicamente sobre DataGrid.
También escribí: deje de degradar cantidades tan grandes de código administrado a código "nativo" antiguo no administrado e improductivo. El retraso en alcanzar el verdadero estado beta ya es muy grande, ¿por qué empeorar el retraso?
@anawishnoff escribió:
estamos interesados en graduarlo a un control nativo de WinUI
"graduarlo a un control nativo de WinUI" constituye prácticamente una continuación / repetición de algunos de los mismos errores que llevaron a las "pérdidas en la participación de mercado y la falta de desarrollo de aplicaciones" mencionadas en Wikipedia:
"En mayo de 2016, Microsoft destruyó su negocio móvil ... En 2017, el ejecutivo de Microsoft, Joe Belfiore, reveló que Microsoft había dejado de desarrollar nuevos teléfonos con Windows y nuevas funciones para Windows 10 Mobile, citando las pérdidas en la participación de mercado y la falta de desarrollo de aplicaciones ".
- https://en.wikipedia.org/wiki/Microsoft_Mobile
¿Por qué DataGrid debería continuar por el mismo camino que destruyó el negocio móvil de Microsoft?
@verelpode
WinUI 3 continúa con los mismos errores de administración que llevaron al fracaso de UWP y Windows Phone y la pérdida multimillonaria de Microsoft.
No trabajo para Microsoft, pero tengo curiosidad por saber por qué dice que WinUI está cometiendo errores de gestión.
Por lo que veo, el hecho mismo de que WinUI es de código abierto y que todos pueden contribuir a las conversaciones y decisiones en realidad está ayudando a definir qué es WinUI y debería evitar que ocurran errores.
Mencionas que DataGrid continúa por el mismo camino que el móvil, pero en ninguna parte del campo vi que mencionara el móvil. Quizás pueda enviar comentarios directamente sobre lo que se está discutiendo en este tema.
Si cree que hay pasos de mala administración con WinUI, entonces tal vez pueda crear un problema separado con sus inquietudes, pero realmente no creo que sus comentarios tengan nada que ver con el control DataGrid.
@verelpode, por favor, mantenga sus comentarios aquí sobre el tema. Si tiene inquietudes sobre WinUI o UWP en general, inicie un nuevo tema de discusión o contácteme directamente (envíeme un correo electrónico o DM en Twitter). O podría considerar discutir sobre un tema existente como el # 717 o el # 1531.
Compartió preocupaciones sobre la reescritura de DataGrid en C ++, pero en realidad la propuesta original no mencionó nada al respecto. @anawishnoff está intentando recopilar comentarios sobre el conjunto de funciones de DataGrid. En cuanto a la implementación, si tiene más sentido mantenerlo en C #, lo haríamos (y aún podría llamarse desde C ++ si lo hiciéramos como un componente de WinRT).
@jevansaks - Mis comentarios fueron sobre el tema, pero es la naturaleza humana disparar al mensajero que da las malas noticias. Tu respuesta me entristece y me decepciona. De acuerdo, dejaré de intentar ayudar, porque mi ayuda no es deseada porque es demasiado honesta y directa y toca temas dolorosos que son demasiado dolorosos para reconocer y resolver (la falla catastrófica de WinRT genera demasiadas emociones y, por lo tanto, es más fácil de borrar). de memoria y continuar con el mismo plan original de WinRT como si el desastre nunca hubiera sucedido). Saldré de esta discusión y no participaré más en el desarrollo de DataGrid porque continuar hablando honesta y directamente sobre los problemas reales solo molestará a la gente.
@verelpode Nadie "disparó al mensajero que da las malas noticias" aquí. @jevansaks lo invitó a abrir un nuevo número para compartir sus inquietudes generales sobre UWP / WinUI / WinRT en este repositorio. Este problema realmente se trata solo de DataGrid y, si bien una de sus preocupaciones era sobre DataGrid, la gran mayoría se refería a UWP / WinUI / WinRT en general. Estoy seguro de que si vuelve a mirar esta discusión, verá que el equipo de WinUI solo le está pidiendo que mantenga este problema enfocado únicamente en la propuesta de DataGrid y que abra un nuevo / use un problema existente para sus preocupaciones más amplias sobre el plataforma.
Las preocupaciones que mencionó pueden ser la base para una discusión interesante que involucre tanto al equipo de WinUI como a la comunidad, pero este tema en particular no es adecuado para tal discusión.
@anawishnoff
Estoy bastante seguro de que Microsoft Pivot Viewer Control no era HTML. Por favor, mire hacia atrás. La capacidad de visualizar grandes conjuntos de datos usando algo así era algo que queríamos hacer en ocasiones. Estaba disponible en Silverlight, creo. https://www.microsoft.com/silverlight/pivotviewer/default# Usó Deep Zoom para su funcionalidad. ¡Agregar la capacidad Deep Zoom a WinUI 3.0 sería fabuloso! No es realmente la cuadrícula de datos, sino un control de visualización de datos. Hay muchas ideas "abandonadas" de los primeros días de WPF, como Deep Zoom, que nunca llegaron a convertirse en un control WPF de producción que sería maravilloso revivir en WinUI 3.0 con el tiempo. ¡¡¡Ve a sacar al Dr. WPF del sótano y haz que publique de nuevo !!! Lo necesitamos de vuelta. Necesitamos iniciar un movimiento. ¡¡¡¡¡TRAIGA AL Dr. WPF !!!!! ¿Dónde has ido? Dr. WinUI !!!
@PaulMontgomerySP parece que debería abrir un nuevo número para discutir el control Pivot. No dude en hacer referencia a la discusión anterior que se tuvo al respecto desde el Kit de herramientas de la comunidad de Windows aquí: https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/770
La selección cambió el evento se activa para cada fila a la que me muevo con el teclado.
Sería bueno tener un evento únicamente para un clic del mouse o toque de celda, en lugar de solo el evento de cambio de selección.
La selección cambió los eventos de activación tanto para el clic como para el teclado. Sería muy beneficioso tener un evento únicamente para hacer clic.
@ Going-Gone Tengo curiosidad por saber cuál es el caso de uso. ¿Por qué necesitas saber la diferencia? Además, ¿no puedes usar el evento tapizado?
Una limitación que acabo de encontrar con el DataGrid del UWP Toolkit es que DataGridTemplateColumn
tiene una CellTemplate, pero no tiene CellTemplateSelector
(y lo mismo falta para CellEditingTemplate
). Simplificaría la adaptación de la interfaz de usuario en cada celda a los datos utilizando el enfoque de selector, en lugar de tener que hacer esto con un nivel adicional de controles de interfaz de usuario debajo para manejar eso.
También haga posible seleccionar filas no solo en un orden consecutivo como lo he explicado en detalle aquí:
https://github.com/duke7553/files-uwp/issues/276#issue -520060100
Sin un orden particular de cosas que los clientes solicitan a menudo y que una red debería admitir
1. Capacidad para guardar, cargar y construir filtros. Por ejemplo, filtrar por expresión de linq, filtrar por consulta SQL, filtrar por árbol de expresión y viceversa. Ejemplo: https://querybuilder.js.org/demo.html
Recursos útiles: - Diseñe mejores tablas de datos
https://news.ycombinator.com/item?id=21460966
https://uxdesign.cc/design-better-data-tables-4ecc99d23356
No podré enlazar al ancho de columna desde el encabezado directamente. En WPF, debo usar un objeto BindingProxy en ese caso.
Cómodo cambio de tamaño dinámico de la fila activa para facilitar la edición.
Control total de los menús contextuales en el modo de edición.
Espero que sea compatible con CellDecorationStyleSelector como en Telerik.
¡Accesibilidad!
Mencionarlo para que esté documentado, pero este control debe ser completamente accesible.
La versión actual del kit de herramientas tiene algunas limitaciones en esta área: https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/3400 & https://github.com/windows-toolkit/WindowsCommunityToolkit/issues/3079
Además, si bien Telerik RadDataGrid tiene algunas características excelentes, parece no ser compatible con la accesibilidad .
Con el gran impulso de Microsoft para D&I, me sorprende que la necesidad de que todos los controles sean completamente accesibles no se especifique como un requisito en todas partes.
Quizás esto ya sea posible, y todavía no sé cómo lograrlo ... pero ¿qué tal: estilo personalizado de fila o celda?
La capacidad de apuntar a una fila específica, alterar el fondo y el color del texto sería excelente.
En comparación con WCT UWP DataGrid:
1) Rendimiento
2) Más tipos de columnas integradas (supongo que tienen un mejor rendimiento que las columnas de plantilla)
3) Posibilidad de enganchar eventos del mouse por celda, es decir, tocar, tocar con el botón derecho y pasar el cursor (o con el puntero hacia abajo o lo que sea)
4) Eventos de teclado por celda
5) Si (3) no funciona, podríamos emular si tuviéramos la funcionalidad de prueba de acceso
6) Rendimiento
¿Cuántas personas plantearían una objeción si WinUI DataGrid abandonara la función en la que los usuarios finales pueden editar valores de celda en línea / directamente dentro de DataGrid?
¿Alguien recuerda VB6? El DataGrid de VB6 admitió Editar, Eliminar y Agregar Nuevo listo para usar. Agregar estaba disponible como una fila en blanco que se agrega automáticamente al final de la lista. Complete la fila y aparecerá otra fila en blanco.
Un DataGrid debe tener la opción de admitir la entrada de datos, incluso si la mayoría de los desarrolladores prefieren que esta función esté desactivada de forma predeterminada.
Al migrar una aplicación VB6 a UWP, tuvimos que escribir nuestra propia cuadrícula de datos para admitir agregar / editar / eliminar.
Parece que la mayoría de los que contribuyen aquí son gente de WPF / Xaml, esto vale dos centavos de alguien que no es un tipo de xaml.
Utilizo mucho los controles DataGrid en mi software. ¡La edición es un lugar importante! Algunos de mis deseos / puntos débiles son:
¿Cuándo se espera que se lance el alfa? ¿Estará abierto a contribuciones? Tratando de deshacerse de una cuadrícula de datos obsoleta y realmente esperando esto, especialmente la función de virtualización.
Perdón por poner una entrada muy tardía en este hilo, pero para mí es "nuevo";)
_editado después de conocer un poco más sobre cómo se comporta el control_
Al trabajar con DataGrid para crear una interfaz similar a un explorador para unidades en la nube, descubrí que determinar la fila y la celda que se aprovechan puede ser un poco más complejo de lo que "debería" ser (en mi humilde opinión)
En el diseño de mi aplicación, las filas representan archivos o carpetas (DriveItems). La vista de detalles muestra más detalles sobre el artículo.
Quería crear la capacidad de hacer clic en un elemento de la carpeta y hacer que la interfaz salte y cree una lista de esos elementos, lo que permite la navegación por todo el disco.
Por ejemplo, si toqué la entrada de la columna "Padre" del elemento, /drive/root:/Documents/Vital%20Documents
aquí, la interfaz se restablecería a esa carpeta y enumeraría los archivos allí.
Aunque se puede obtener un evento en el que se hizo clic para la celda, ese evento no parece tener el contexto para que el controlador determine la celda que se tocó (fila, sí, pero no columna), y no estoy seguro de que actualmente el el control me permitiría tener tanto el comportamiento de interceptación de celda como el comportamiento de detalles abiertos automáticamente (aún investigando lo que podría llamar "hacks" que permitirían eso, pero tenemos que recordarnos que cuando los diseñadores comiencen a anular el funcionamiento normal del control, especialmente no comportamientos que están documentados, corren el riesgo de que el diseño se rompa debido a cambios en el comportamiento del control.
Dicho todo esto, DataGrid parece respaldar mi escenario al tener el evento que actualmente devuelve DriveItem como CurrentItem, también debería incluir un CurrentColumn
que sería el objeto DataGridColumn
completo en el que se hizo clic, a través de del cual sería posible extraer el nombre de la columna. Ahora me doy cuenta de que tenemos el objeto CurrentColumn que podemos investigar a partir del evento, por lo que, aunque me gustaría más, ya que el evento argumenta, esto debería funcionar.
Además, un control más estricto del comportamiento de los detalles podría ser que los detalles solo se expandieran automáticamente en función de hacer clic en una columna en particular, en lugar de expandirse cada vez que se hace clic en cualquier parte de la fila.
Tal vez la clase base del objeto DataGridColumn
podría tener una propiedad ExpandDetails
que se puede establecer como verdadera de forma predeterminada para cada columna, lo que significaría que se hace clic en esa columna en particular y hace que la fila se expanda. Otros donde la propiedad es falsa no lo serían.
En mi diseño, por ejemplo, la primera columna es el tipo de elemento, como en Archivo o Carpeta, o Imagen o Foto, Audio, etc. Podría imaginar configurar esa columna para que sea la única que provoque el comportamiento de expansión automática, y luego un clic en la columna Ruta podría causar el comportamiento de "obtener una lista de esa ruta" que describí anteriormente.
En cuanto a la clasificación, parecería lógicamente importante implementar suficiente control para permitir a los diseñadores obtener una clasificación de varios niveles. No he realizado una investigación para determinar cómo el control actual podría admitir esto mediante eventos de enganche / anulación y devoluciones de llamada, pero no parece sencillo.
Finalmente, sé que es muy consciente de esto, pero (incluso cuando estoy pidiendo más funcionalidad), evitemos POR FAVOR intentar agregar un montón de comportamientos complejos que los usuarios pueden implementar ellos mismos en la parte superior de DataGrid. Entre estos que no implementaría en DataGrid están los que tienen que ver con el almacenamiento externo de filtros o clases, etc. También evitaría convertir este control en un clon de Excel.
-gracias, gran trabajo!
-mi
Grupos fijos: cuando se navega por conjuntos de datos con grupos grandes, debe haber un contexto sobre qué grupo (o grupos, es decir, ruta de navegación) se está viendo. Esto parece una característica de usabilidad esencial para todas las vistas jerárquicas basadas en listas: vistas de listas agrupadas, cuadrículas de datos y vistas de árbol.
Construiría el nuevo control DataGrid sobre el nuevo control WinUI ItemsRepeater. Y ese control expone su ItemsSource como un Objeto:
Object ItemsSource { get; set; };
@RBrid Volviendo a esto ~ 1 año después. Me di cuenta de que ItemsRepeater, aunque tiene un objeto ItemsSource, en realidad no tiene soporte integrado para las siguientes interfaces necesarias para trabajar con fuentes de datos virtualizadas:
-¿Qué hay de tener un MVP allí ahora para que podamos usar un Datagrid de c ++?
Comentario más útil
Mi lista de deseos: para mí, una buena cuadrícula de datos incluye todas las características siguientes de forma predeterminada. Estoy tomando prestadas algunas capturas de pantalla del mundo html.
Filtre fácilmente toda la página con el recuento de filas preferido.
Seleccionar / anular la selección de columnas visibles, clasificación de columnas, copiar, imprimir
Exportar datos a un formato específico.
Reordenación de columnas arrastrando la columna.
Filtrado de columnas
Encabezado fijo: donde el encabezado permanece en la parte superior incluso cuando se desplaza
Detalles de fila con plantilla XAML para obtener detalles.
Agrupación de filas
Orden de filas de arrastrar y soltar
En mi opinión, las características anteriores deberían ser estándar en todas las cuadrículas de datos.
Si desea que la cuadrícula de datos se destaque en el mundo html, también incluiría lo siguiente. Me encuentro muchas veces mirando una cuadrícula de datos y luego estableciéndome en una vista de lista ya que la cuadrícula de datos carece de estas características.
Desliza la fila lateralmente para incluir funciones como editar, eliminar, marcar, etc.
Las características anteriores manejan principalmente la "presentación de datos", lo que todavía falta en WinUI es lo que creo que debería ser una característica nativa de WinUI (control) como Microsoft Pivot Control. para complementar la cuadrícula de datos.
MS ya tiene el código fuente para esto y fue un control absolutamente increíble en los días.
https://www.youtube.com/watch?v=ZJIkQ9nebKY
Ahora cubre la presentación y visualización de datos que deberían ser el mínimo para diferenciar a WinUI de todas las características básicas que existen.
Lo más importante es que realmente muestra el poder de las "aplicaciones nativas" que deberían incluir animaciones asombrosas y controles visualmente atractivos que son poderosos y se ven realmente geniales.
Puedo llevar esto un paso más allá y decir que después de las características anteriores (visualizaciones) podemos incluir animaciones 2D / 3D que crean un concepto de profundidad en los datos y nos llevarán a una estratosfera diferente, pero supongo que eso es para otro día; ))