我有一个项目,其中XmlDataProvider绑定到WPF DataGrid控件。我在DataGrid上的绑定设置如下:
<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添加新行(即新Person)。我怎么能允许这个?
答案 0 :(得分:19)
确保设置:CanUserAddRows="True"
并且绑定类的默认构造函数可用。
答案 1 :(得分:3)
要向绑定到XmlDataSource的WPF DataGrid添加行,您需要直接修改后备数据存储。您可以使用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;
}
}
答案 2 :(得分:0)
您是否尝试在DataGrid上设置CanUserAddRows =“True”?
答案 3 :(得分:0)
问题是用户无法添加行,还是当用户添加行时,它是否未保存到支持XML存储中?我可以轻松地将一个带有CanUserAddRows =“True”的数据网格添加到WPF应用程序,将网格绑定到内存列表,然后让用户添加反映在该内存列表中的行。这让我觉得你的问题是保存到后备存储。
当我绑定到文件系统上的XML时,我无法再将记录添加到数据网格中。我认为您需要一个小的解决方法,即将文件读入内存中的集合,绑定到该集合,然后在用户添加行时相应地更新文件。