是否可以将动态属性绑定到WinForms控件属性?

时间:2010-08-19 13:16:02

标签: c# winforms data-binding properties

我想将动态属性绑定到WinForms控件属性。

在下面的示例中,我将线程的IsAlive属性绑定到Enabled of a button。

using System;
using System.Windows.Forms;
using System.Threading;

namespace ThreadTest
{
  public partial class Form1 : Form
  {
    Thread thread;

    public Form1()
    {
      InitializeComponent();

      thread = new Thread(() =>
        {
          while (true)
            Thread.Sleep(125);
        }
      );

      button2.DataBindings.Add("Enabled", thread, "IsAlive");
    }

    private void buttonStart_Click(object sender, EventArgs e)
    {
      thread.Start();
    }

    private void buttonStop_Click(object sender, EventArgs e)
    {
      // ...
    }
  }
}

这仅适用于启动。 “停止”按钮被禁用,因为线程不活动。当我点击“开始”按钮时,我希望将按钮“停止”更改为启用。但事实并非如此。

我错过了什么或者这是不可能的吗?

2 个答案:

答案 0 :(得分:3)

线程没有实现INotifyPropertyChanged,也没有“IsAliveChanged”事件,因此数据绑定无法识别IsAlive是否已更改。

This blog entry有一些提示和技巧可以使数据绑定在WinForms中运行。主要要求是,如果要支持从数据源到控件的动态更新,那么绑定到的类必须考虑数据绑定。

答案 1 :(得分:1)

WinForms中的数据绑定相当破碎,因为它们只能以一种方式自动运行(当您更改UI时,对象会更新)。如果您拥有用于绑定的对象,则应在其上实现INotifyPropertyChanged接口。在你的情况下,你必须手动重置绑定,使其工作(所以绑定不会给你任何东西)