如何从数据表中的列读取值列表,数据表中的数据来自xml文件到数据网格中的组合框

本文关键字:数据表 数据 文件 xml 网格 组合 数据网 读取 列表 | 更新日期: 2023-09-27 18:09:17

我有以下xml文件

<WG>
  <WGT>
  <TName>tanme1</TName> 
  <Fname>fname1</Fname> 
  <Product>Product1</Product> 
  <Product>Product2 </Product> 
  </WGT>
  <WGT>
  <TName>tanme2</TName> 
  <Fname>fname2</Fname> 
  </WGT>
  <WGT>
  <TName>tanme1</TName> 
  <Fname>fname1</Fname> 
  <Product>Product1</Product> 
  <Product>Product2 </Product> 
  <Product>Product3 </Product> 
  <Product>Product4 </Product> 
  </WGT>
</WG>

我试图将其绑定到视图中的datagrid (xaml代码)

下面是ViewModel类中的代码片段。

private DataTable dt;
public DataTable DT
       {
           get
           {
               return dt;

           }
           set
           {
               dt = value;
               NotifyPropertyChanged("DT");
           }
       }
XmlReader xmlFile = XmlReader.Create("C:/Wafers/WGen.xml", new XmlReaderSettings());
DataSet ds = new DataSet();
ds.ReadXml(xmlFile);
dt = ds.Tables[0];

当运行wpf项目时,在视图中我只能看到"TName"answers"Fname"字段和值。

我想通过绑定在数据网格中的组合框中显示产品值列表。如何检索所有的产品值列表从数据表dt在视图模型类,以便我可以绑定它在视图?

如何从数据表中的列读取值列表,数据表中的数据来自xml文件到数据网格中的组合框

创建一个datagridtemplatecoluml:

 <DataGridTemplateColumn Header="Product" Width="Auto" MinWidth="120">
                <DataGridTemplateColumn.CellTemplate>
                   <DataTemplate DataType="YourModel">
                        <ComboBox
                            ItemsSource="{Binding Path=Products}"                                
                            SelectedValuePath="Key" 
                            DisplayMemberPath="Key"
                            SelectedItem="{Binding SelectedValue, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                            />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

ItemSource是一个包含模型产品键和值的字典。

添加:

 Dictionary<string, string> Products{ get; set; }

您可以从dataTable创建自定义DataGrid:

1。Xaml:

   <DataGrid x:Name="DataGrid" Grid.Column="0" Grid.Row="0"
                      ItemsSource="{Binding GenericDataView}"
                      attachedBehaviors:DataGridColumnsBehavior.BindableColumns="{Binding GridColumns}"
                      AutoGenerateColumns="False"
                      EnableRowVirtualization="False"
                      />

2。填写数据表3.创建GridColumnsCollection和DataView:

 GridColumns = new ObservableCollection<DataGridColumn>();
  public DataView GenericDataView { get; private set; }

4。遍历数据表行并创建自定义列,下面是动态创建ComboBoxColumn的示例:

        ItemsProducts = new ObservableCollection<productModel>();
                                        ItemsProducts = YourProducts           
                                        DataGridComboBoxColumn comboBoxColumn = new DataGridComboBoxColumn();
                                        comboBoxColumn.Header = row["displayname"].ToString();
                                        comboBoxColumn.SelectedValuePath = "Key";
                                        comboBoxColumn.DisplayMemberPath = "Value";
                                        Binding binding = new Binding();
                                        binding.Path = new PropertyPath(row["name"].ToString());
                                        comboBoxColumn.SelectedValueBinding = binding;
                                        Binding itemsSourceBinding = new Binding();
                                        itemsSourceBinding.Source = ItemsProducts;
                                        BindingOperations.SetBinding(comboBoxColumn, DataGridComboBoxColumn.ItemsSourceProperty, itemsSourceBinding);
                                        GridColumns.Add(comboBoxColumn);
                                    }
                                    ColumnsList.Add(row["name"].ToString()); //add the real column name

5。在循环所有行并填充数据之后:

    RaisePropertyChanged("GridColumns");
    GenericDataView = new DataView(dt);
    RaisePropertyChanged("GenericDataView");

我想你可以试试这个方法,在dt中你可以得到产品值

财产

 private DataView dt;
        public DataView DT
        {
            get
            {
                return dt;
            }
            set
            {
                dt = value;
                NotifyPropertyChanged("DT");
            }
        }

ViewModel:

XmlDocument doc = new XmlDocument();
            doc.Load("d:''file.txt");
            XmlReader xmlFile = new XmlNodeReader(doc);
           DataSet ds = new DataSet();
           ds.ReadXml(xmlFile);
           DT = ds.Tables[1].AsDataView();
XAML:

<ComboBox x:Name="cmbBox" ItemsSource="{Binding DT}" Width="100" Height="100" DisplayMemberPath="Product_Text" SelectedValuePath="WGT_Id"></ComboBox>