【问题标题】:Text field bound to property in another class does not update绑定到另一个类中的属性的文本字段不更新
【发布时间】:2011-08-08 19:36:42
【问题描述】:

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

我使用了 VisualStudio IDE。它为绑定创建了以下代码

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

在表单构造函数中,在初始化值之后添加代码以将 MyData 类绑定到表单

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

我尝试在 MyForm.MyBackgroundWorker_RunWorkerCompleted 方法中添加 Refresh() 和 Update(),但数据仍然没有刷新。

如果我稍后运行不同的后台工作程序来更新同一表单上的不同文本框,则绑定到 PropertyInMyDataClass 的文本框会更新

如果有建议可以帮助我理解和解决这个数据绑定问题,我将不胜感激

【问题讨论】:

    标签: c# .net winforms data-binding backgroundworker


    【解决方案1】:

    问题来自几个角度。如果您在后台线程上运行该进程,则后台线程不能直接访问表单上的控件(位于不同的线程中),否则您将获得异常。您也不能期望 UI 线程根据后台线程中的状态进行更新,除非您将其连接起来这样做。为此,您需要在主 UI 线程上调用委托。

    将此代码(修改它以使用您想要的任何值类型更新您想要的任何控件)放在 UI 表单上。

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

    然后你可以在你的后台工作线程中调用这个函数。 (假设你的后台进程函数在同一个表单中,你可以直接调用它),如果没有,那么你需要在后台进程运行的类中引用 UI 表单。

    【讨论】:

    • 谢谢@David C。我在这个表单上有大约 15 个字段需要更新,我可以等到在 UI 线程上调用 BackgroundWorkker_RunWorkerCompleted。您的代码是解决此问题的正确方法。如果我可以等到后台工作人员完成更新字段,有没有办法启动刷新?
    • @Darwin 您如何构建对后台工作人员的调用并填充数据对象。数据对象是静态的还是类似的?
    • 否,数据对象不是静态的,但在后台工作进程完成之前,没有任何数据有效。该类有许多用于计算的输入属性,计算完成后,表单上有许多结果需要更新。也许数据绑定给我带来了更多它修复的问题。
    • @Darwin 好吧,如果它是适合这项工作的工具,您可以使用它。关于数据绑定的事情是您的绑定源设置为各个控件的属性。因此,无论您的数据如何更新,当您希望更新每个字段时,您都必须在每个字段上调用数据源绑定刷新。您可以通过循环遍历表单上的每个控件来完成此操作,或者通过编写一个函数来单独更新它们。然后,这只是您在何处或何时调用它的问题(在后台线程中,或在后台线程停止后的主窗体上)。
    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2020-03-05
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2010-11-14
    相关资源
    最近更新 更多