将文本框绑定到属性类

时间:2013-02-12 12:40:43

标签: c# .net winforms thread-safety

我有这些:

  • 带有标签的表单
  • “商务”课程
  • “TimerHelper”类

我想更新属性MyTime时,也要更新文本框

我的“商务”课程如下:

public class MyBusinessClass : INotifyPropertyChanged
{
    public void MakeSound(object sender, ElapsedEventArgs e)
    {
        // I change MyTime here
    }   
    public event PropertyChangedEventHandler PropertyChanged;
    private int myTime;
    public int MyTime
    {
        get { return myTime; }
        set
        {
            myTime= value;
            InvokePropertyChanged(new PropertyChangedEventArgs("MyTime"));
        }
    }
    public void InvokePropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, e);
    }
}

“TimerHelper”如下所示:

public class TimerHelper
{
    private Timer _timer;
    public void Run()
    {
        _timer = new Timer(1000);
        _timer.Enabled = true;
        _timer.Elapsed += new ElapsedEventHandler(MyBusinessClass.MakeSound);
    }
}

在表格中,我试过这个:

myTextBox.DataBindings.Add("Text", new MyBusinessClass(), "MyTime");

但我在方法“InvokePropertyChanged”中遇到异常 enter image description here

我试过了:

Invoke((MethodInvoker)delegate { myTextBox.Text = new MyBusinessClass().MyTime; });

但textBox永远不会更新

3 个答案:

答案 0 :(得分:1)

我认为您的问题是您正在尝试通过其他线程的数据库更新文本框。 我的意思是,你正在使用System.Timers.Timer类来调用线程池中的Elapsed事件。 数据绑定无法更新控件,因为您正在更改该线程池中的业务类。 您应该在Elapsed事件处理程序中更改线程上下文,并在主线程(创建文本框的位置)中更新您的业务模型。

public class TimerHelper
{    
   private Timer _timer;
   public void Run()
   {
      _timer = new Timer(1000);
      _timer.Enabled = true;
      _timer.Elapsed += new ElapsedEventHandler(OnTimerElapsed);
   }
}

void OnTimerElapsed (object sender, ElapsedEventArgs e)
{
    if (myTextBox.InvokeRequired)
    {
        myTextBox.Invoke(MyBusinessClass.MakeSound);
    }
}

}

答案 1 :(得分:0)

虽然我没有看到您在哪里设置MyTime的值(我假设它在MakeSound?),但是您要在除MyTime以外的其他线程上设置值System.Timers.Timer UI线程。您可能正在使用System.Timers.Timer类,该类不在UI线程上执行事件处理程序。如果要使用ElapsedEventHandler并对其SynchronizingObject委托中的UI进行更改,则需要使用计时器上的{{1}}属性。有关详细信息,请参阅此MSDN文章:Comparing the Timer Classes

答案 2 :(得分:0)