我使用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>
我绑定的CalculatedTable是 DataTable
我如何使用它进行初始化的示例:
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是表示此类数据的最佳方式,还是会有更适合我需要的其他类型的Collection。此外,这个解决方案看起来不是100%线程安全的,因为我的输出窗口中不时有以下异常:
System.Windows.Data错误:17:无法获得'1'值(类型'Int32') 来自''(类型'DataRowView')。 BindingExpression:路径= 1; DataItem ='DataRowView'(HashCode = 31910704);目标元素是 'TextBlock'(Name =''); target属性是'Text'(类型'String') IndexOutOfRangeException:'System.IndexOutOfRangeException:Index is 在数组的边界之外。在 System.Data.Common.Int32Storage.Get(Int32记录)at System.Data.DataRow.get_Item(DataColumn列,DataRowVersion System.Data.DataRowView.GetColumnValue(DataColumn system)在System.Data.DataColumnPropertyDescriptor.GetValue(Object 组件)在MS.Internal.Data.ValueTable.GetValue(对象项, PropertyDescriptor pd,Boolean indexerIsNext)at MS.Internal.Data.PropertyPathWorker.GetValue(对象项,Int32级) 在MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'
答案 0 :(得分:1)
就数据绑定而言,集合类型不应该是真正重要的。某种类型的集合具有使查找项目等更快的特征,但这是另一个故事。
您应该只绑定到源集合一次,然后更新集合中的各个项目。这需要数据类型来实现INotifyPropertyChanged
接口。内置的DataRowView
类可以。
如果可以动态地从集合中添加或删除项目,则需要使用实现INotifyCollectionChanged
或IBindingListView
接口的集合。您目前正在使用ObservableCollection<T>
班级或DataView
班级。
另请注意,如果您不打算编辑数据,则没有理由使用DataGrid
。然后,您也可以使用ListView
和GridView
。
答案 1 :(得分:0)
我认为ObservableCollection最符合您的需求。
你可以绑定它,.Net将负责其余部分。