Как создать новую строку в WPF DataGrid, когда она привязана к 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. Как я могу это разрешить?

Ответ 1

Убедитесь, что вы установили: CanUserAddRows="True" и что конструктор по умолчанию класса bound доступен.

Ответ 2

Чтобы добавить строку в DataGrid WPF, привязанную к XmlDataSource, вам необходимо напрямую изменить хранилище данных резервного копирования. Вы можете использовать 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;
  }
}

Ответ 3

Вы пытались установить CanUserAddRows = "True" в DataGrid?

Ответ 4

Проблема заключается в том, что пользователь не может добавлять строки или это значит, что когда пользователь добавляет строку, он не сохраняется в хранилище XML-хранилища? Я могу легко добавить datagrid с CanUserAddRows = "True" в приложение WPF, привязать сетку к списку в памяти, а затем добавить пользователя, которые будут отображаться в этом списке в памяти. Это заставляет меня думать, что ваша проблема заключается в сохранении хранилища.

Когда я привязываюсь к XML в файловой системе, я больше не могу добавлять записи в сетку данных. Я думаю, вам понадобится небольшое обходное решение в том, что вы читаете файл в коллекции в памяти, привязываетесь к нему и затем соответствующим образом обновляете файл, так как пользователи добавляют строки.