C# 对于不断变化的表表示形式,最佳的集合类型是什么
我使用MVVM在WPF中表示一个表。表中每个元素的数据类型为int,如下所示: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
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();
});
}