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

问题描述:

我想将动态属性绑定到WinForms控件属性。是否有可能将动态属性绑定到WinForms控件属性?

在以下示例中,我将线程的IsAlive属性绑定到按钮的Enabled。

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) 
    { 
     // ... 
    } 
    } 
} 

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

我错过了什么,或者这只是不可能?

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

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

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