是否有可能将动态属性绑定到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接口。在你的情况下,你必须手动重置绑定,使其工作(所以绑定并没有真正给你任何东西)