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

4 回答 4

19

确保您设置:CanUserAddRows="True"并且绑定类的默认构造函数可用。

于 2009-07-05T00:37:05.193 回答
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;
  }
}
于 2009-07-06T16:32:56.303 回答
0

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

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

于 2009-06-25T16:32:15.713 回答
0

您是否尝试过在 DataGrid 上设置 CanUserAddRows="True"?

于 2009-01-31T22:57:17.463 回答