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

4

我希望将动态属性绑定到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)
    {
      // ...
    }
  }
}

这仅在启动时有效。因为线程没有运行,所以“停止”按钮被禁用。当我点击“开始”按钮时,我期望将“停止”按钮更改为启用状态。但实际情况并非如此。

我是否遗漏了什么或者这不可能实现?

3个回答

3
Thread没有实现INotifyPropertyChanged,也没有“IsAliveChanged”事件,因此数据绑定无法识别IsAlive已更改。本博客文章提供了一些使数据绑定在WinForms中工作的技巧和提示。主要要求是,如果您想支持从数据源到控件的动态更新,则绑定的类必须考虑到数据绑定。

1
WinForms中的数据绑定相当不完善,因为它们自动地只能单向工作(当您更改UI时,对象会得到更新)。如果您拥有用于绑定的对象,则应在其上实现INotifyPropertyChanged接口。在您的情况下,您必须手动重置绑定才能使其工作(因此绑定实际上并没有给您任何东西)。

0

称DataBindings为“broken”是不正确的。Broken意味着某些东西不能按照设计工作 - 但是查看源代码,它正好按照设计工作。而且使用像Fody的PropertyChanged weaver这样的工具,您可以使几乎每个使用INotifyPropertyChanged的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接