对于不断变化的表表示形式,最佳集合类型是什么



我使用 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类可以。

如果可以在集合中动态添加或删除项,则需要使用实现INotifyCollectionChangedIBindingListView接口的集合。有您当前正在使用的ObservableCollection<T>类或DataView类。

另请注意,如果您不打算编辑数据,则没有理由使用DataGrid。那你不妨用一个ListViewGridView.

我认为ObservableCollection最适合您的需求。

您可以绑定到它,.Net 将负责其余的工作。

最新更新