1

我遇到了设计模式 MVVM 的问题。在我的视图中,我得到了一个绑定到我的视图模型中的数据表的 Datagrid。

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

在视图模型的构造函数中,我加载了 ItemsSource。

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

如果我在运行时通过按钮添加一些额外的行,一切正常。但我不想按下按钮来刷新数据网格,我希望它在线程或后台工作人员中自动发生。

这是一些测试示例:

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

这不起作用......我不知道为什么......这些行被添加到数据表“StapelListe”中,但数据网格不会自行刷新......

如果我在线程中更改数据表中的现有行,它会起作用!它只是不适用于从集合中添加或删除行。

有人知道为什么会发生这种情况和/或如何解决它?

亲切的问候...

4

2 回答 2

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
        };
于 2012-12-07T09:19:38.580 回答
1

正如 MegaMind 所写,视图需要知道某些事情已经发生了变化。如果您要向现有 DataTable 添加新行,则视图永远不会收到已添加内容的通知。因此,您应该使用为此制作的集合:ObservableCollection<T>.

于 2012-12-07T09:27:23.763 回答