c# wpf wpftoolkit xmldataprovider

c# - ¿Cómo creo una nueva fila en WPF DataGrid cuando está vinculada a un XmlDataProvider?



wpftoolkit (4)

¿Has intentado configurar CanUserAddRows = "True" en el DataGrid?

Tengo un proyecto con un XmlDataProvider vinculado a un control WPF DataGrid. Tengo los enlaces en DataGrid configurados de la siguiente manera:

<dg:DataGrid ItemsSource="{Binding Source={StaticResource XmlData}, XPath=Root/People/Person}" AutoGenerateColumns="False"> <dg:DataGrid.Columns> <dg:DataGridTextColumn Header="ID" Binding="{Binding XPath=ID}"/> <dg:DataGridTextColumn Header="Name" Binding="{Binding XPath=Name}"/> </dg:DataGrid.Columns> </dg:DataGrid>

Los usuarios pueden editar entradas usando DataGrid sin ningún problema. Lo que no puedo lograr es permitir que el usuario agregue una nueva fila (es decir, una nueva Persona) usando DataGrid. ¿Cómo puedo permitir esto?


¿El problema es que el usuario no puede agregar filas o es que cuando el usuario agrega una fila, no se guarda en el almacén XML de respaldo? Puedo agregar fácilmente una cuadrícula de datos con CanUserAddRows = "True" a una aplicación WPF, unir la cuadrícula a una lista en memoria y luego hacer que el usuario agregue filas que se reflejan en esa lista en memoria. Eso me hace pensar que tu problema es guardar en la tienda de respaldo.

Cuando me enlace a un XML en el sistema de archivos, ya no puedo agregar registros a la cuadrícula de datos. Creo que necesitará una pequeña solución ya que debe leer el archivo en una colección en memoria, vincularse a eso y luego actualizar el archivo en consecuencia a medida que los usuarios agregan filas.


Para agregar una fila a un WGD DataGrid que está vinculado a un XmlDataSource, necesita modificar directamente el almacén de datos de respaldo. Puede usar DataGrid para recopilar la nueva información de fila del usuario y luego en el evento RowEditEnding , puede agregar la información de la fila a su almacén de respaldo y evitar que DataGrid intente realmente comprometer la edición usando su lógica interna. Dado que DataGrid está vinculado a XmlDataSource, mostrará los cambios que realizó en la tienda de respaldo.

Aquí está la idea general:

private void MyDataGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { if (e.EditAction == DataGridEditAction.Cancel) { e.Cancel = false; return; } if (e.EditAction == DataGridEditAction.Commit) { DataGridRow dgr = e.Row; XmlElement xe = myXmlDataProvider.Document.CreateElement("NewRowElement"); foreach(DataGridCell cell in dgr.Cells) { xe.SetAttribute(cell.Name, cell.Value); } dataProvider.Document.DocumentElement.AppendChild(xe); e.Cancel = true; } }


Asegúrese de establecer: CanUserAddRows="True" y que el constructor predeterminado de una clase enlazada esté disponible.