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

C# 对于不断变化的表表示形式,最佳的集合类型是什么,c#,wpf,mvvm,datatable,datagrid,C#,Wpf,Mvvm,Datatable,Datagrid,我使用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来实现这一点: <DataGrid ItemsSource="{Binding CalculatedTable}"> </DataGr

我使用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来实现这一点:

 <DataGrid ItemsSource="{Binding CalculatedTable}">                
        </DataGrid>
我如何更改它的示例:

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”) 从“”(键入“DataRowView”)。BindingExpression:Path=1; DataItem='DataRowView'(HashCode=31910704);目标元素是 “TextBlock”(名称=“”);目标属性为“Text”(类型为“String”) IndexOutOfRangeException:'System.IndexOutOfRangeException:索引为 在数组的边界之外。在 System.Data.Common.Int32Storage.Get(Int32记录)位于 System.Data.DataRow.get_项(DataColumn列,DataRowVersion 版本),位于System.Data.DataRowView.GetColumnValue(DataColumn 列)位于System.Data.DataColumnPropertyDescriptor.GetValue(对象 组件)位于MS.Internal.Data.ValueTable.GetValue(对象项, PropertyDescriptor pd,布尔索引器(下一步)位于 MS.Internal.Data.PropertyPathWorker.GetValue(对象项,Int32级别) 位于MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'

我认为最适合你的需要


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

就数据绑定而言,集合类型实际上并不重要。某些类型的集合具有使查找项目等更快的特性,但这是另一回事

您应该只绑定到源集合一次,然后更新集合中的各个项。这需要数据类型来实现
INotifyPropertyChanged
接口。内置的
DataRowView
类不支持

如果可以从集合中动态添加或删除项,则需要使用实现
INotifyCollectionChanged
IBindingListView
界面的集合。您当前正在使用的是
observateCollection
类或
DataView


还请注意,如果不打算编辑数据,则没有理由使用
DataGrid
。然后您也可以将
列表视图
网格视图

一起使用,因此,如果我使用DataView就像使用ObservableCollection一样,对实际datatable的任何更改都会更改视图本身?是的,当您在datatable中设置单元格的值时,视图会更改。这是否回答了您的问题?请记住接受答案。
Queue(() =>
            {               
            UpdateTable();
            });   

void UpdateTable(){
    DataRow dr = CalculatedTable.Rows[i];
    addon = int.Parse(dr[0].ToString());
    dr[0] = addon + 1;
    OnPropertyChange(nameof(CalculatedTable));
    Queue(() =>
            {               
            UpdateTable();    
            });            
}