在 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在一种情况下可以正常工作,而在另一种情况下不能正常工作?
UI 控件
的更新必须在 UI 线程上进行,以便控件自行更新。
虽然你可能已使用"b"调用更新了集合,但"a"调用位于正确的线程上,因此导致 UI 更新。
有一些方法可以在 WinForms 视图中检查更新是否发生在正确的线程上 - 请查看此问题的答案以获取示例: 自动执行调用所需的代码模式