2011-08-08 29 views
0

我有一个Windows窗体“MyForm”,它具有绑定到另一个类“MyData”中的属性的文本框。数据源更新模式设置为“On Property Change”绑定到另一个类中的属性的文本字段不会更新

我使用VisualStudio IDE。它创建了下面的代码结合

this.txtYield.DataBindings.Add(new Binding("Text", this.BindingSourceMyDataClass, "PropertyInMyDataClass", true, DataSourceUpdateMode.OnPropertyChanged)); 

在表单构造,加入初始化后的值的代码到迈德特类结合形式

myDataClassInstantiated = new MyDataClass(); 
BindingSourceMyDataClass.DataSource = myDataClassInstantiated; 

的INotifyProperty接口已经实现:

public double PropertyInMyDataClass 
{ 
    get { return _PropertyInMyDataClass; } 
    set 
    { 
     if (!Equals(_PropertyInMyDataClass, value)) 
     { 
      _PropertyInMyDataClass = value; 
      FirePropertyChanged("PropertyInMyDataClass"); 
     } 
    } 
} 

后台工作者用于运行计算并更新属性'PropertyInMyDataClass'

我希望窗体上的文本框会在后台工作完成时自动更新。这并没有发生

如果我手动复制指定从属性到窗体的文本框中的值,正常显示的数值

this.txtYield.Text = String.Format("{0:F0}", myDataClassInstantiated.PropertyInMyDataClass); 

我试图刷新()和Update()添加到MyForm.MyBackgroundWorker_RunWorkerCompleted方法,但数据仍未刷新。

如果我以后运行不同的背景的工人,同样的形式更新不同的文本框,势必PropertyInMyDataClass文本框中被更新

我会很感激的建议,这将有助于我了解并解决此数据绑定问题

回答

0

问题来自几个角度。如果您正在后台线程上运行进程,后台线程无法直接直接访问窗体上的控件(它位于另一个线程中),否则您将得到一个异常。你也不能指望UI线程根据后台线程中的状态进行更新,除非你将它连接起来。为了做到这一点,您需要在主UI线程上调用委托。..

在UI窗体上放置此代码(修改它以更新所需的任何控件类型)。

public void UpdateOutput(string text) 
    { 
     this.Invoke((MethodInvoker) delegate { 
      lstOutput.Items.Add(text); 
     }); 
    } 

然后你可以在后台工作线程中调用这个函数。 (假设你的后台处理功能住在相同的形式,可以直接调用它),如果没有,那么你就需要在后台进程中运行类UI形式的参考。

+0

感谢@大卫C.我在此表单上有大约15个字段需要更新,我可以等到BackgroundWorkker_RunWorkerCompleted在UI线程上调用。你的代码是解决这个问题的正确方法。如果我可以等到后台工作人员完成更新字段,那么是否有办法启动刷新? – DarwinIcesurfer

+0

@达尔文你如何构建对后台工作者的调用,并填充数据对象。数据对象是静态还是类似的? –

+0

否数据对象不是静态的,但在后台工作进程完成之前,没有任何数据有效。该类具有许多用于计算的输入属性,在计算完成后,需要在表单上更新许多结果。也许数据绑定导致我修复更多的问题。 – DarwinIcesurfer

相关问题