C# 当WPF DataGrid绑定到XmlDataProvider时,如何在WPF DataGrid中创建新行?
我有一个XmlDataProvider绑定到WPF DataGrid控件的项目。我将DataGrid上的绑定设置如下:C# 当WPF DataGrid绑定到XmlDataProvider时,如何在WPF DataGrid中创建新行?,c#,wpf,wpftoolkit,xmldataprovider,C#,Wpf,Wpftoolkit,Xmldataprovider,我有一个XmlDataProvider绑定到WPF DataGrid控件的项目。我将DataGrid上的绑定设置如下: <dg:DataGrid ItemsSource="{Binding Source={StaticResource XmlData}, XPath=Root/People/Person}" AutoGenerateColumns="False"> <dg:DataGrid.Columns> <dg:
<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>
用户可以使用DataGrid编辑条目,而不会出现任何问题。我无法做到的是允许用户使用DataGrid添加一个新行(即,一个新的人)。如何允许此操作?您是否尝试过在DataGrid上设置CanUserAddRows=“True”问题在于用户无法添加行,或者当用户添加行时,它没有保存到备份XML存储中?我可以轻松地将带有CanUserAddRows=“True”的datagrid添加到WPF应用程序,将网格绑定到内存列表,然后让用户添加反映在内存列表中的行。这让我觉得你的问题是把钱存到后备商店
当我绑定到文件系统上的XML时,我不能再向数据网格添加记录。我认为您需要一个小的解决方法,将文件读入内存集合,绑定到该集合,然后在用户添加行时相应地更新文件 确保设置:
CanUserAddRows=“True”
并且绑定类的默认构造函数可用。要向绑定到XmlDataSource的WPF数据网格添加行,需要直接修改备份数据存储。您可以使用DataGrid从用户收集新行信息,然后在RowEditEnding事件中,您可以将行的信息添加到备份存储中,并防止DataGrid实际尝试使用其内部逻辑提交编辑。由于DataGrid绑定到XmlDataSource,它将显示您对备份存储所做的更改
以下是总体思路:
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;
}
}
我今天遇到了同样的问题。我已经显式地设置了CanUserAddRows=true,但当我在即时窗口中发现时,它立即变为false。原因是绑定类没有默认构造函数。添加默认构造函数后,我在末尾得到了新行。我无法从
dgr
或DataGridRow
中找到Cells
属性这是4.0之前的WPF信息--我想行和单元格集合可能不再是公共的了?检查项目集合。我回答的要点是,您需要修改备份数据存储,我认为这仍然是正确的。太棒了!我从来没有意识到默认构造函数是必要的,你能详细说明一下你对默认构造函数的意思吗?如何使用XmlDataSource实现这一点?