如何在代码隐藏的 wpf 数据网格中添加行,因为数据网格是使用 Xml 文件绑定的



我正在使用一个 Xml 文件使用以下代码加载 Wpf 数据网格

 <Window.Resources>
    <XmlDataProvider x:Key="FilterData" 
        Source="E:/WPF12/Main27-02-15/IntelligraphicsSniffer24-2-15/Intelligraphics Sniffer/Resources/XMLFile2.xml" XPath="NewDataSet"/>
</Window.Resources>

    <DataGrid x:Name="AddFilterDataGrid" Height="220" GridLinesVisibility="None"  DataContext="{StaticResource FilterData }" AutoGenerateColumns="False"
                                 ItemsSource="{Binding XPath=Filter}" >

                            <DataGrid.Columns>
                                <DataGridTextColumn 
                Header="Name" 
                Binding="{Binding XPath=name}"/>
                                <DataGridTextColumn 
                Header="filter0" 
                Binding="{Binding XPath=filter0}"/>
                                <DataGridTextColumn 
                Header="filter1" 
                Binding="{Binding XPath=filter1}" Visibility="Hidden" />
                            </DataGrid.Columns> </DataGrid>

示例 XML 文件为:

<NewDataSet>
  <Filter>
    <name>one</name>
    <filter0>12</filter0>
    <filter1>15</filter1>
  </Filter>
  <Filter>
    <name>sathish </name>
    <filter0>999</filter0>
    <filter1>robo</filter1>
  </Filter>
  </NewDataSet>

加载表单后,WPF 数据网格将使用 XML 文件加载。 它工作正常。 但我的要求是在单击按钮后将行添加到代码中的数据网格。

我为按钮单击事件编写了代码,如下所示

  public void Addfilterrow(string filname,string comments,string src,string dst)
    {
        AddFilterDataGrid.Items.Add(new AddfilterRow() { filtername = filname, filter0 = parentWindow.filterarr[0]});
    }

类 AddfilterRow 是 :

  public class AddfilterRow
    {
        public string filtername { get; set; }
        public UInt16 filter0 { get; set; }
        public UInt16 filter1 { get; set; }  }

如果我使用此代码,则会收到类似这样的异常"使用ItemsSource时操作无效。使用 ItemsControl.ItemsSource 访问和修改元素"

可以建议我一个解决方案吗?

谢谢萨蒂什。

public void Addfilterrow(string filname,string comments,string src,string dst)
{
    AddFilterDataGrid.Items.Add(new AddfilterRow() { filtername = filname, filter0 = parentWindow.filterarr[0]});
}

根据此处的 Microsoft 文档,Items 是只读属性。您应该改用 ItemsSource。

[编辑] 根据您的评论编辑答案。ItemsSource 是一个 IEnumerable,因此要么将项目添加到集合中,要么创建一个新集合。

public void Addfilterrow(string filname,string comments,string src,string dst)
{
    ICollection<AddFilterRow> items = AddFilterDataGrid.ItemsSource as ICollection<AddFilterRow> ;
    if(items==null)
       return;
    items.Add(new AddfilterRow() { filtername = filname, filter0 = parentWindow.filterarr[0]});
    AddFilterDataGrid.ItemsSource = items
}

最新更新