如何构建具有未知列数的WPF数据网格
我需要从一个从txt获得的字符串数组的集合中构建和显示WPF数据网格。 问题是我不知道先验的是列数,即单个数组中的项数。 所以我在我的xaml中定义了
我试图在我的视图模型中填充它,但我不能简单地将我的数组的集合(Observable Collection)作为项目源,因为数据网格将只显示空行。
我也可以使用其他方法而不是Observable集合,因为我使用相同的方法生成我的数组
这是我的Observable Collection:
ObservableCollection Rows = new ObservableCollection;
在这个方法中我填写了集合
foreach(ListViewItem item in wsettings.lista) { TextBlock line = item.Content as TextBlock; string txt = line.Text; string[] x = txt.Split(stringSeparators, StringSplitOptions.None); Rows.Add(x); }
请不要介意分手前的第一部分。 我从之前使用过的文本块列表视图中获取数据(我有理由)。
EDIT1:使代码更具可读性
EDIT2:标题必须是用户必须设置的combobox
.Net中有DataTable
类 。 它的主要目的是与关系数据库进行通信,但它可以很好地用于存储,显示和编辑表格数据(例如,读取和显示.csv / Excel文件 – > Wpf中的DataTable + DataGridView
,WinForms中的DataTable + DataGridView
)。
DataTable列(DataColumn)可以在运行时添加/删除,DataGrid为它们自动生成列(DataGridColumn)(默认情况下启用),使用标题的Name属性。 DataTable也支持开箱即用的排序和过滤。
注意:分配新的ItemsSource时,DataGrid不会清除Columns
。 所以可以有一些预定义的列并使用autogenerate。
注意:DataGrid默认创建DataGridTextColumn
。 如果需要更复杂的模板,可以通过AutoGeneratingColumn
事件拦截该过程( 参见示例 )
这是一个例子:
码
public class MyViewModel { public DataTable Test { get; set; } } public MyWindow() { InitializeComponent(); var vm = new MyViewModel { Test = new DataTable { Columns = {"A", "B", "C"} } }; this.DataContext = vm; }
XAML
结果(我输入了一些值)
如果在编译时不知道列数,则需要以编程方式创建列。 这在视图中应该非常简单。 以下示例代码应该为您提供以下建议:
public MainWindow() { InitializeComponent(); var viewModel = new ViewModel(); var rows = viewModel.Rows; int numberOfColumns = rows[0].Length; //assume all string[] have the same length DataContext = new VM1(); for (int i = 0; i < numberOfColumns; ++i) { dataGrid1.Columns.Add(new DataGridTextColumn() { Binding = new Binding("[" + i + "]"), Header = i.ToString() }); } dataGrid1.ItemsSource = rows; }
- 结构 – 它的用途是什么?
- WebRequest:如何使用针对此ContentType的WebRequest查找邮政编码=“application / xhtml + xml,text / xml,text / html; 字符集= UTF-8” ?
- 为什么不在CultureInfo.GetCultures()中展示所有国家/地区?
- 在Mac上部署没有Framework的Mono应用程序
- 实体类型不是当前上下文的模型的一部分
- P / Invoke,Pinning和KeepAlive最佳实践
- 有没有办法获取System.Random的实际状态?
- 全局设置String.Compare/ CompareInfo.Compare到Ordinal
- (ID / ParentID)列表到分层列表