不断更改表格表示的最佳集合类型是什么

时间:2017-07-19 12:44:18

标签: 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}">                
        </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)'

2 个答案:

答案 0 :(得分:1)

就数据绑定而言,集合类型不应该是真正重要的。某种类型的集合具有使查找项目等更快的特征,但这是另一个故事。

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

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

另请注意,如果您不打算编辑数据,则没有理由使用DataGrid。然后,您也可以使用ListViewGridView

答案 1 :(得分:0)

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

你可以绑定它,.Net将负责其余部分。