我使用 MVVM 在 WPF 中表示一个表。表中每个元素的数据类型为 int,如下所示:
0 1 2 3 1 2 12
0 1 3 3 1 3 12
0 1 2 3 5 2 12
0 1 2 3 1 2 12
类似于多维数组。表中的数据不断变化(来自另一个线程,例如:每秒(
我已经通过使用数据网格来做到这一点:
<DataGrid ItemsSource="{Binding CalculatedTable}">
</DataGrid>
我绑定的计算表是一个数据表
我如何使用它进行初始化的示例:
CalculatedTable.Columns.Add("1", typeof(int));
CalculatedTable.Columns.Add("2", typeof(int));
CalculatedTable.Columns.Add("3", typeof(int));
CalculatedTable.Columns.Add("4", typeof(int));
CalculatedTable.Columns.Add("5", typeof(int));
CalculatedTable.Rows.Add(10, 12, 15, 2, 5);
CalculatedTable.Rows.Add(54, 21, 15, 2, 1);
CalculatedTable.Rows.Add(24, 13, 25, 11, 1);
CalculatedTable.Rows.Add(21, 32, 15, 13, 3);
CalculatedTable.Rows.Add(56, 45, 35, 19, 8);
我如何更改它的示例:
Queue(() =>
{
UpdateTable();
});
void UpdateTable(){
DataRow dr = CalculatedTable.Rows[i];
addon = int.Parse(dr[0].ToString());
dr[0] = addon + 1;
OnPropertyChange(nameof(CalculatedTable));
Queue(() =>
{
UpdateTable();
});
}
我担心DataTable和DataGrid是否是表示此类数据的最佳方式,或者是否有另一种类型的集合更适合我的需求。此外,看起来此解决方案不是 100% 线程安全的,因为我的输出窗口中不时出现以下异常:
System.Windows.Data 错误: 17: 无法获取"1"值 (键入"Int32"( 从"(键入"数据行视图"(。绑定表达式:路径=1; DataItem='DataRowView' (HashCode=31910704(;目标元素为 "文本块"(名称="(;目标属性为"文本"(类型"字符串"( IndexOutOfRangeException:'System.IndexOutOfRangeException: Index is 在数组边界之外。 在 System.Data.Common.Int32Storage.Get(Int32 record( at System.Data.DataRow.get_Item(数据列列,数据行版本 版本(在 System.Data.DataRowView.GetColumnValue(DataColumn column( at System.Data.DataColumnPropertyDescriptor.GetValue(Object 组件(在 MS。Internal.Data.ValueTable.GetValue(Object item, PropertyDescriptor pd, Boolean indexerIsNext( at 女士。Internal.Data.PropertyPathWorker.GetValue(Object item, Int32 level( 在MS。Internal.Data.PropertyPathWorker.RawValue(Int32 k('
就数据绑定而言,集合类型并不重要。某些类型的集合具有可以更快地查找项目等的特征,但那是另一回事了。
应仅绑定到源集合一次,然后更新集合中的各个项。这需要数据类型来实现INotifyPropertyChanged
接口。内置DataRowView
类可以。
如果可以在集合中动态添加或删除项,则需要使用实现INotifyCollectionChanged
或IBindingListView
接口的集合。有您当前正在使用的ObservableCollection<T>
类或DataView
类。
另请注意,如果您不打算编辑数据,则没有理由使用DataGrid
。那你不妨用一个ListView
和GridView
.
我认为ObservableCollection最适合您的需求。
您可以绑定到它,.Net 将负责其余的工作。