如何将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,
【问题讨论】:
您可以使用属性Value1
到value4
创建一个类,并使用该类的数组而不是int 数组。
可以通过数组来实现吗?我见过这个link,但我不知道如何创建方法GetItems(arr);
。我不知道如何将数组和类集合一起使用
“我想将 Array 绑定到一个 4 列 DataGrid” - 您的草图结果意味着一个 5 列的表。
数组不满足列出的要求。接受这一事实并使用不同的数据结构。具有整数列的 DataTable 应该可以正常工作
谢谢大家,我也想知道我上面贴的link中的第二种方法的完整实现。
【参考方案1】:
您只能使用数组来做到这一点。请注意,ItemsControl.ItemsSource
的类型为 IEnumerable
:您可以将数组直接分配给此属性。ToList()
调用在这里是多余的。
还要用DataGridTextColumn
代替DataGridTemplateColumn
来消除对单元格模板的修改,只添加TextBlock
。
DataGrid
将其IEnumerable
源集合中的每个项目视为一行。这就是您的表格看起来如此的原因:每个数字都写入一个新行。对每一列都重复此操作。
这意味着,您必须更改数据结构以适应每一项到一行的规则。因为您有五列,所以您必须构建数组以提供 5 元组(五元组)的元素 - 每个五元组元素为一行。 您可以通过使用锯齿状数组(即数组数组)来实现这一点。
然后在配置DataGrid.Columns
时,您必须使用绑定索引器才能从数组(行数据)中提取列的值。
“用于自动更新 [...]”
您必须知道,使用数组时没有“自动更新”。如果您想在应用程序运行时修改数组(动态数据),您必须使用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>
【讨论】:
以上是关于如何将Array数据绑定到DataGrid并实现数据更新?的主要内容,如果未能解决你的问题,请参考以下文章
WPF DataGrid - 如何暂停数据绑定中的 UI 更新并稍后进行批量更新
如何将光标设置在绑定到数据表的datagrid中空行的第一个单元格上
如何将 WPF DataGrid 绑定到 ObservableCollection