如何在绑定到XmlDataProvider时在WPF DataGrid中创建新行?

时间:2009-01-26 15:13:31

标签: 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:DataGridTextColumn Header="ID" Binding="{Binding XPath=ID}"/>
        <dg:DataGridTextColumn Header="Name" Binding="{Binding XPath=Name}"/>
    </dg:DataGrid.Columns>
</dg:DataGrid>

用户可以使用DataGrid编辑条目而不会出现任何问题。我无法实现的是允许用户使用DataGrid添加新行(即新Person)。我怎么能允许这个?

4 个答案:

答案 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时,我无法再将记录添加到数据网格中。我认为您需要一个小的解决方法,即将文件读入内存中的集合,绑定到该集合,然后在用户添加行时相应地更新文件。