在 MVVM 模式中将 DataGridView 绑定到数据表不能很好地与线程处理配合使用

本文关键字:线程 处理 很好 不能 模式 MVVM DataGridView 数据表 绑定 | 更新日期: 2023-09-27 18:33:56

我已经使用 Windows Forms 在 c# 中应用了 MVVM 模式。在视图(MainForm(中,我将DataGridView"InstalledChartsView"绑定到DataTable "ChartTable"。

 BindingSource binding = new BindingSource
 {
     DataSource = m_ViewModel.ChartTable
 };
 InstalledChartsView.DataSource = binding;

此图表表是在视图模型中创建的"图表"类的一部分:

    private Charts m_Charts;
    public DataTable ChartTable
    {
        get { return m_Charts.ChartTable; }
        set
        {
            m_Charts.ChartTable = value;
            NotifyPropertyChanged("ChartTable");
        }
    }

现在真正应该发生的是,m_Charts(模型(,正在运行一个线程,该线程不断从在线数据库更新此 ChartTable。数据表会正确更新,但网格视图不会。

但是,对于测试,我什至没有接触模型,而是从视图(MainForm(做一些事情。我一直在运行以下线程,那里发生了奇怪的事情。

  new Thread( () =>
        {
            for ( ; ; )
            {
               m_ViewModel.AddRow("b", "b", "b", "b");
                //Some unrelated stuff happens here.
                try
                {
                    BeginInvoke( (Action) ( () =>
                    {
                        m_ViewModel.AddRow("a","a","a","a");
                    }
                 }
                 catch{};
                 Thread.sleep();
             }
         }

现在,两个"AddRow"注释都或多或少地正确执行:将一行添加到模型中的表中。但是,视图仅在 aaaa 语句中更新!此时,两行都会正确显示。

这是我的addRow方法:

       public void AddRow(string a, string b, string c, string d)
    {
        m_Charts.ChartTable.Rows.Add(a, b, c, d);
        NotifyPropertyChanged("ChartTable");
    }

谁能阐明为什么NotifyPropertyChanged在一种情况下可以正常工作,而在另一种情况下不能正常工作?

在 MVVM 模式中将 DataGridView 绑定到数据表不能很好地与线程处理配合使用

UI 控件

的更新必须在 UI 线程上进行,以便控件自行更新。

虽然你可能已使用"b"调用更新了集合,但"a"调用位于正确的线程上,因此导致 UI 更新。

有一些方法可以在 WinForms 视图中检查更新是否发生在正确的线程上 - 请查看此问题的答案以获取示例: 自动执行调用所需的代码模式