我遇到了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」添加,但數據網格是不打算刷新自己...
如果我在它的工作原理線程更改現有行中的數據表!它不適用於添加或刪除集合中的行。
有人知道爲什麼發生這種情況和/或如何解決它?
親切的問候...
是的ObservableCollection肯定會工作,但他有一個數據表,使用可觀察的集合,他需要遍歷整個數據表,並獲得所需的集合,我猜大開銷。 – MegaMind
@MegaMind是的,他必須將DataTable轉換爲ObservableCollection。但我認爲這不會是一個很大的開銷。相反,這就是ViewModel的用途:將Model數據(在本例中爲DataTable)轉換爲View正確理解的內容(在本例中爲ObservableCollection)。 –
完全同意你的觀點,或者他必須使用可觀察的集合,或者需要更改列表的引用,以防他想要堅持列表。在List的情況下,他必須實現INotifyPropertyChanged,通過可觀察的集合,他可以很好地完成該接口。 – MegaMind