C# WPF将行添加到XML绑定的数据网格

C# WPF将行添加到XML绑定的数据网格,c#,xml,wpf,vb.net,datagrid,C#,Xml,Wpf,Vb.net,Datagrid,调试时,我无法向DataGrid添加行 设置:我有一个XML文件(C:\test.XML),用作DataGrid的XmlDataProvider XAML: <Window x:Class="iDraft.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height

调试时,我无法向DataGrid添加行

设置:我有一个XML文件(C:\test.XML),用作DataGrid的XmlDataProvider

XAML:

<Window x:Class="iDraft.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="185" Width="176">

<Grid>
    <Grid.DataContext>
        <XmlDataProvider x:Name="myData" XPath="Table/ENTRY" />
    </Grid.DataContext>

    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" CanUserAddRows="True">
    <DataGrid.Columns>

            <DataGridTextColumn Header="Text" Binding="{Binding XPath=text, Mode=TwoWay}"/>

            <DataGridTemplateColumn Header="Combobox">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Text="{Binding XPath=combo, Mode=TwoWay}">
                            <ComboBoxItem>0</ComboBoxItem>
                            <ComboBoxItem>1</ComboBoxItem>
                            <ComboBoxItem>2</ComboBoxItem>
                            <ComboBoxItem>3</ComboBoxItem>
                            <ComboBoxItem>4</ComboBoxItem>
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>                
        </DataGrid.Columns>
    </DataGrid>
  </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

namespace iDraft
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            myData.Source = new Uri(@"C:\test.xml");
        }
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<Table>
  <ENTRY>
    <text>1</text>
    <combo>1</combo>
  </ENTRY>
  <ENTRY>
    <text>2</text>
    <combo>1</combo>
  </ENTRY>
</Table>
XML(test.XML):

<Window x:Class="iDraft.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="185" Width="176">

<Grid>
    <Grid.DataContext>
        <XmlDataProvider x:Name="myData" XPath="Table/ENTRY" />
    </Grid.DataContext>

    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}" CanUserAddRows="True">
    <DataGrid.Columns>

            <DataGridTextColumn Header="Text" Binding="{Binding XPath=text, Mode=TwoWay}"/>

            <DataGridTemplateColumn Header="Combobox">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Text="{Binding XPath=combo, Mode=TwoWay}">
                            <ComboBoxItem>0</ComboBoxItem>
                            <ComboBoxItem>1</ComboBoxItem>
                            <ComboBoxItem>2</ComboBoxItem>
                            <ComboBoxItem>3</ComboBoxItem>
                            <ComboBoxItem>4</ComboBoxItem>
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>                
        </DataGrid.Columns>
    </DataGrid>
  </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

namespace iDraft
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            myData.Source = new Uri(@"C:\test.xml");
        }
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<Table>
  <ENTRY>
    <text>1</text>
    <combo>1</combo>
  </ENTRY>
  <ENTRY>
    <text>2</text>
    <combo>1</combo>
  </ENTRY>
</Table>

因为您的
myData.Source
是一个URI,所以它总是只读的。您需要将XML中的数据放入另一个介质(类/数据表),并处理添加/更新和将数据保存回XML格式。

因为您的
myData.Source
是一个URI,它始终是只读的。您需要将XML中的数据放入另一个介质(类/数据表),并处理添加/更新和将数据保存回XML格式。

分辨率: 我去掉了XmlDataProvider,并在XAML中将XPath更改为Path。除此之外,我的后端代码保持不变(vb.net不是C#代码)


唯一需要注意的是绑定路径必须引用XML节点名。

解析: 我去掉了XmlDataProvider,并在XAML中将XPath更改为Path。除此之外,我的后端代码保持不变(vb.net不是C#代码)


唯一需要注意的是,绑定路径必须引用XML节点名称。

您真的应该为这个编辑开始一个新问题。通过将XML放入数据表,就网格而言,它不再是XML,因此您需要删除XML数据提供程序的内容。您真的应该为此编辑开始一个新问题。通过将XML放入数据表,就网格而言,它不再是XML,因此需要删除XML数据提供者的内容。