当WPF DataGrid绑定到XmlDataProvider时,我该如何创建新的行?

13

我有一个使用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添加新行(比如新人员)。有什么方法可以实现这一点?

4个回答

19

请确保设置:CanUserAddRows="True",以及绑定类的默认构造函数可用。


5
太棒了!我从未意识到默认构造函数是必需的。 - Gurucharan Balakuntla Maheshku
2
请问您可以详细说明一下默认构造函数的含义吗?您如何在XmlDataSource中实现这一点? - Tronald

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;
  }
}

我无法在 dgrDataGridRow 中找到 Cells 属性。 - Bolu
这是4.0版本之前的WPF信息 - 我认为行和单元格集合可能不再是公共的了?请检查Items集合。我的答案的主要观点仍然成立,即您需要修改后备数据存储。 - Timothy Lee Russell

0
你尝试在DataGrid上设置CanUserAddRows="True"了吗?

7
今天我遇到了同样的问题。我已经明确设置CanUserAddRows = true,但是从即时窗口中发现它立即变为false。原因是绑定类没有默认构造函数。一旦我添加了默认构造函数,我就可以在末尾得到新行。 - miliu

0

问题是用户无法添加行,还是当用户添加行时,它没有保存到后台的XML存储中?我可以轻松地在WPF应用程序中添加CanUserAddRows="True"的数据网格,将网格绑定到内存列表,然后让用户添加反映在该内存列表中的行。这使我认为你的问题是保存到后台存储。

当我绑定到文件系统上的XML时,我不能再向数据网格添加记录。我认为您需要一个小的解决方法,即将文件读入内存集合中,将其绑定到该集合,然后随着用户添加行相应地更新文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接