2012-12-07 155 views
1

我遇到了designpattern MVVM的問題。 在我看來,我得到了一個Datagrid綁定到我的viewmodel中的數據表。如何通過多線程將DataRow添加到ViewModel中的DataTable

 <WPF:BADataGrid Grid.Column="1" x:Name="dgStapelliste" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Stapelliste, Mode=OneWay}"/> 

在我的viewmodel的構造函數中,我加載了ItemsSource。

 this.StapelListe = this._stapel.Get(); 

如果我通過一個按鈕在運行時添加一些額外的行一切工作正常。 但我不想推按鈕來刷新數據網格,我希望它自動發生在線程或後臺工作。

Here's一些測試例子:

 BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += delegate(object s, DoWorkEventArgs args) 
     { 
      while (true) 
      { 
       Thread.Sleep(5000); 

       DataRow row = this.StapelListe.NewRow(); 
       row["StapelNr"] = 123456; 
       this.StapelListe.Rows.Add(row); 
      } 
     }; 

本不需額外的工作...和我不知道爲什麼...行DataTable中「StapelListe」添加,但數據網格是不打算刷新自己...

如果我在它的工作原理線程更改現有行中的數據表!它不適用於添加或刪除集合中的行。

有人知道爲什麼發生這種情況和/或如何解決它?

親切的問候...

回答

1

由於MEGAMIND寫道,查看需要知道事情已經改變。如果您將新的行添加到現有的DataTable中,則View從不會收到有關已添加內容的通知。所以你應該使用一個爲此製作的集合:ObservableCollection<T>

+0

是的ObservableCollection肯定會工作,但他有一個數據表,使用可觀察的集合,他需要遍歷整個數據表,並獲得所需的集合,我猜大開銷。 – MegaMind

+0

@MegaMind是的,他必須將DataTable轉換爲ObservableCollection。但我認爲這不會是一個很大的開銷。相反,這就是ViewModel的用途:將Model數據(在本例中爲DataTable)轉換爲View正確理解的內容(在本例中爲ObservableCollection)。 –

+0

完全同意你的觀點,或者他必須使用可觀察的集合,或者需要更改列表的引用,以防他想要堅持列表。在List的情況下,他必須實現INotifyPropertyChanged,通過可觀察的集合,他可以很好地完成該接口。 – MegaMind

2

你犯了數據綁定的經典錯誤。你應該如何更新屏幕,如果你永遠不會讓你的GUI知道有什麼變化。要做到這一點,你需要使用NotifyPropertyChanged接口。

實現從INotifyPropertyChanged接口的視圖模型。

這是一個可以把你在工作中

您不必使用線程來完成這項工作的代碼片段,很少會就好了,只要你叫更新收集後NotifyProperyChanged。

如果你不使用的ObservableCollection,你必須更新列表中,這將是有點痛苦到你的應用程序的參考;表現

 BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += delegate(object s, DoWorkEventArgs args) 
     { 
      while (true) 
      { 
       Thread.Sleep(5000); 
       DataRow row = this.StapelListe.NewRow(); 
       row["StapelNr"] = 123456; 
       this.StapelListe.Rows.Add(row); 
       Datatable dt=new datatable(); //new reference 
       foreach (DataRow dr in StapelListe.Rows) 
       {  
       dt.Rows.Add(dr.ItemArray); 
       } 

       StapelList=dt; //updating the reference of property 
       // when the above line executes your property setter fires 
       // and calls notifyproperty changed and then all done 
     }; 
+0

只有在您替換列表時纔會更新。 –

+0

是的...我試着在線程中提出propertychanged事件...但是那也不管用。給出了相同的結果 –

+0

這種方法的問題是,如果您爲底層DataTable調用PropertyChanged,則意味着View將不得不重做整個DataTable數據的顯示。如果使用ObservableCollection,它只需要更新實際更改的數據。 –

相關問題