如何将Array数据绑定到DataGrid并实现数据更新?

Posted

技术标签:

【中文标题】如何将Array数据绑定到DataGrid并实现数据更新?【英文标题】:How to bind Array data to DataGrid and realize data update? 【发布时间】:2021-12-23 08:44:48 【问题描述】:

我想将 Array 绑定到 4 列 DataGrid 并更新数据。这可能吗?

如果不能实现,需要如何修改?

对于自动更新,似乎我们可以绑定到一些具有可编辑值的对象集合,就是为项目定义一个类。但我不知道该怎么做。

 public partial class MainWindow : Window
  
    int X=18;   
    public MainWindow()
    
      InitializeComponent();
      int[] arr = new int[]  61, 61, 61, 61, 61, 20, 30, 40, 50, 100, 200, 300, 400, 500, 0, 0, 0, 0, 0, 18, 23, 65, 41, 22, 91, 64, 33, 18, 44, 63, 91, 26, 32, 61, 83, 91, 26, 32, 91, 91, 91, 91 ;
      DataGrid dataGrid = new DataGrid();
      dataGrid.AutoGenerateColumns = false;
      dataGrid.ItemsSource = arr.ToList();
      for (int i = 1; i < 5; i++)
      
        DataGridTemplateColumn column = new DataGridTemplateColumn();
        column.Header = "Value"+i;
        DataTemplate cellTemplate = new DataTemplate();
        FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock));
        textBlock.SetBinding(TextBlock.TextProperty, new Binding("."));
        cellTemplate.VisualTree = textBlock;
        column.CellTemplate = cellTemplate;

        DataTemplate cellEditingTemplate = new DataTemplate();
        FrameworkElementFactory textBox = new FrameworkElementFactory(typeof(TextBox));
        textBox.SetBinding(TextBox.TextProperty, new Binding("."));
        cellEditingTemplate.VisualTree = textBox;
        column.CellEditingTemplate = cellEditingTemplate;

        dataGrid.Columns.Add(column);
      
      canvas.Children.Add(dataGrid);
      Canvas.SetLeft(dataGrid, X);
    
  

结果:

我想要这样的结果:

61、61、61、61、61,

20、30、40、50、100,

200, 300, 400, 500, 0,

0, 0, 0, 0, 18,

【问题讨论】:

您可以使用属性Value1value4 创建一个类,并使用该类的数组而不是int 数组。 可以通过数组来实现吗?我见过这个link,但我不知道如何创建方法GetItems(arr);。我不知道如何将数组和类集合一起使用 “我想将 Array 绑定到一个 4 列 DataGrid” - 您的草图结果意味着一个 5 列的表。 数组不满足列出的要求。接受这一事实并使用不同的数据结构。具有整数列的 DataTable 应该可以正常工作 谢谢大家,我也想知道我上面贴的link中的第二种方法的完整实现。 【参考方案1】:

您只能使用数组来做到这一点。请注意,ItemsControl.ItemsSource 的类型为 IEnumerable:您可以将数组直接分配给此属性。ToList() 调用在这里是多余的。 还要用DataGridTextColumn代替DataGridTemplateColumn来消除对单元格模板的修改,只添加TextBlock

DataGrid 将其IEnumerable 源集合中的每个项目视为一行。这就是您的表格看起来如此的原因:每个数字都写入一个新行。对每一列都重复此操作。

这意味着,您必须更改数据结构以适应每一项到一行的规则。因为您有五列,所以您必须构建数组以提供 5 元组(五元组)的元素 - 每个五元组元素为一行。 您可以通过使用锯齿状数组(即数组数组)来实现这一点。

然后在配置DataGrid.Columns 时,您必须使用绑定索引器才能从数组(行数据)中提取列的值。

“用于自动更新 [...]”

您必须知道,使用数组时没有“自动更新”。如果您想在应用程序运行时修改数组(动态数据),您必须使用ObservableCollection&lt;int[]&gt; 而不是int[][] 锯齿状数组。

MainWindow.xaml.cs

public partial class MainWindow : Window

  public MainWindow()
  
    InitializeComponent();

    this.Loaded += OnLoaded;
  

  private void OnLoaded(object sender, RoutedEventArgs e)
  
    int[][] numbers = 
     
      new[]  61, 61, 61, 61, 61 , 
      new[]  20, 30, 40, 50, 100 ,
      new[]  200, 300, 400, 500, 0  
    ;
        
    this.NumbersDataGrid.ItemsSource = numbers;
 

MainWindow.xaml

<Window>
    <DataGrid x:Name="NumbersDataGrid"
              AutoGenerateColumns="False">
    <DataGrid.Columns>
      <DataGridTextColumn Header="Value1"
                          Binding="Binding [0]" />
      <DataGridTextColumn Header="Value2"
                          Binding="Binding [1]" />
      <DataGridTextColumn Header="Value3"
                          Binding="Binding [2]" />
      <DataGridTextColumn Header="Value4"
                          Binding="Binding [3]" />
      <DataGridTextColumn Header="Value4"
                          Binding="Binding [4]" />
    </DataGrid.Columns>
  </DataGrid>
</Window>

【讨论】:

以上是关于如何将Array数据绑定到DataGrid并实现数据更新?的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid - 如何暂停数据绑定中的 UI 更新并稍后进行批量更新

如何将光标设置在绑定到数据表的datagrid中空行的第一个单元格上

如何将 WPF DataGrid 绑定到 ObservableCollection

easyui-datagrid如何获取 空白行

如何将 List<CustomObject> 绑定到 WPF DataGrid?

如何将 DataTable 绑定到 Datagrid