我遇到了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