13

XmlDataProviderがWPFDataGridコントロールにバインドされたプロジェクトがあります。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

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

DataGridでCanUserAddRows="True"を設定してみましたか?

于 2009-01-31T22:57:17.463 に答える
0

問題は、ユーザーが行を追加できないことですか、それともユーザーが行を追加しても、バッキング XML ストアに保存されないことですか? CanUserAddRows="True" を使用してデータグリッドを WPF アプリケーションに簡単に追加し、グリッドをメモリ内リストにバインドしてから、そのメモリ内リストに反映される行をユーザーに追加させることができます。それはあなたの問題がバッキングストアに保存されていると私に思わせます。

ファイル システムで XML にバインドすると、データ グリッドにレコードを追加できなくなります。ファイルをメモリ内コレクションに読み込み、それにバインドし、ユーザーが行を追加するとそれに応じてファイルを更新するという小さな回避策が必要になると思います。

于 2009-06-25T16:32:15.713 に答える