2014-10-06 34 views
0

我正在尋找一種正確的方式來自動更新綁定的數據網格「非醜陋的方式」。我有,我有綁定到數據表中一個DataGrid WPF應用程序:正確的方式來自動更新綁定的數據網格(非醜陋的方式)

MeasurementResultsDataGrid.ItemsSource = _main.CurrentMeasurement.MeasurementDataTable.AsDataView(); 

非常簡單!接下來是我使用的接口INotifyPropertyChanged到模型與UI同步:

public event PropertyChangedEventHandler PropertyChanged; 

    public MeasurementDataSet.MeasurementDataTable MeasurementDataTable 
    { 
     get 
     { 
      return _measurementDataTable; 
     } 
     set 
     { 
      _measurementDataTable = value; 
      NotifyPropertyChanged("MeasurementDataTable"); 
     } 
    } 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

一個線程添加新行到DataTable和任何給沒有錯誤。有點期待,當線程更新表時,DataGrid不會更新/「刷新」。做這個的最好方式是什麼?我寧可不使用單獨的計時器/線程來更新數據網格:datagrid.refresh(); & datagrid rebind ..

我在這方面搜索了很多,而且看起來我在正確的軌道上,但是錯過了我認爲的一些關鍵部分!

回答

0

經過長時間搜索並嘗試建議的答案,我實現了@ coder0815答案的第二部分,並使用Observable集合而不是DataTable。看來,現在我不必實現INotifyCollectionChanged接口,UI自動更新!

只有當你嘗試更新集合,如果你在UI線程上創建集合,大部分時間發生在WPF中。在WPF < 4.5中,您必須使用委託來超越「此類CollectionView不支持從與Dispatcher線程不同的線程更改其SourceCollection」的異常。如果你有WPF> 4.5,可以使用以下命令:

創建UI線程上的變量,例如:

私人的SynchronizationContext _uiContext;

在你的用戶界面的創建,初始化值:

_uiContext =的SynchronizationContext。當前;

現在可以很容易地使用使用以下來更新集合:

_uiContext.Send(X => YOUR_METHOD(),NULL);

用您在集合中使用的方法替換YOUR_METHOD!

+0

對於你的問題,這不是最好的方法。這與使用委託相同,我認爲'SynchronizationContext'自.NET 2.0起可用 – Bolu 2014-10-10 13:39:47

0

首先不要綁定到方法的返回值,因爲那麼返回值會被複制並且永遠不會改變。

將您的ItemsSource綁定到實現INotifyPropertyChanged的屬性。 就你而言,我建議使用ObservableCollection。如果存儲在集合中的項目正在實現INotifyPropertyChanged並且更改了beeing,則可以獲得更新,而不會調用refresh()rebind()

+0

第一個不是真的,如果我手動刷新數據網格,結果都顯示出來。第二我同意,但我希望能夠使用數據表而不是ObservableCollection .. – Velocity 2014-10-06 10:45:07

+0

如果你手動更新它當然會工作,但那不是Databinding的意思。通常你將它正確地綁定到一個屬性上,並且不再需要擔心更新UI – coder0815 2014-10-06 12:50:26

0

你可以添加一個屬性:

public DataView MeasurementDataTableView 
    { 
     get 
     { 
      return MeasurementDataTable.AsDataView(); 
     }   
    } 

然後用這個作爲的ItemsSource(不知道這是否會工作,如果沒有,我覺得你可以只使用XAML代碼結合與設置):

MeasurementResultsDataGrid.SetBinding(DataGrid.ItemsSourceProperty, "MeasurementDataTableView") ; 

因此,您可以在將新行添加到數據表後添加NotifyPropertyChanged("MeasurementDataTableView")

相關問題