2017-07-19 67 views
1

我使用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我勢必是數據表

的我如何使用它初始化一個例子:我如何改變它

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();  
      });    
} 

我擔心,如果數據表和DataGrid是代表這種數據的最佳方式或是否會有另一種類型的收集這將更好地滿足我的需要。此外,它看起來像這樣的解決方案是不是100%線程安全的,因爲我有以下從時間例外的時間在我的輸出窗口:

System.Windows.Data Error: 17 : Cannot get '1' value (type 'Int32') from '' (type 'DataRowView'). BindingExpression:Path=1; DataItem='DataRowView' (HashCode=31910704); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String') IndexOutOfRangeException:'System.IndexOutOfRangeException: Index was outside the bounds of the array. at System.Data.Common.Int32Storage.Get(Int32 record) at System.Data.DataRow.get_Item(DataColumn column, DataRowVersion version) at System.Data.DataRowView.GetColumnValue(DataColumn column) at System.Data.DataColumnPropertyDescriptor.GetValue(Object component) at MS.Internal.Data.ValueTable.GetValue(Object item, PropertyDescriptor pd, Boolean indexerIsNext) at MS.Internal.Data.PropertyPathWorker.GetValue(Object item, Int32 level) at MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'

回答

1

就數據綁定而言,集合類型應該無關緊要。某些類型的集合具有使查找物品等更快的特徵,但這是另一個故事。

您應該只綁定到源集合一次然後更新集合中的單個項目。這要求數據類型實現接口INotifyPropertyChanged。內置DataRowView類。

如果可以動態添加或從集合中刪除項目,您希望使用實現INotifyCollectionChangedIBindingListView接口的集合。有你正在使用的ObservableCollection<T>類或DataView類。

另請注意,如果您不打算編輯數據,則沒有理由使用DataGrid。那麼你可以使用ListViewGridView

+0

因此,如果我使用DataView就像使用ObservableCollection一樣,對實際數據表的任何更改都會改變視圖本身? – berthos

+0

是的,當您在DataTable中設置單元格的值時,視圖將被更改。 – mm8

+0

這是否回答你的問題?請記住接受答案。 – mm8

相關問題