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

How to bind Array data to DataGrid and realize data update?

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

如果无法实现,需要如何修改?

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

 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,

您只能使用数组来完成。请注意,ItemsControl.ItemsSourceIEnumerable 类型:您可以将数组直接分配给此 属性.
ToList() 调用在这里是多余的。
同样使用DataGridTextColumn代替DataGridTemplateColumn来消除单元格模板的修改,只添加一个TextBlock.

DataGrid 将其 IEnumerable 源集合的每个项目视为一行。这就是为什么您的 table 看起来是这样的:每个数字都被写入一个新行。对每一列重复此操作。

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

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

"For automatic updates [...]"

你要知道,使用数组是没有“自动更新”的。如果要在应用程序处于 运行(动态数据)时修改数组,则必须使用 ObservableCollection<int[]> 而不是 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>