2

我有这些:

  • 带有标签的表格
  • “商务”类
  • 一个类“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”方法中遇到异常 在此处输入图像描述

我试过这个:

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

但文本框永远不会更新

4

3 回答 3

1

我在那里找到了答案: A generic asynchronous asynchronous INotifyPropertyChanged helper

于 2013-02-12T14:21:44.097 回答
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);
    }
}

}

于 2013-02-12T14:27:48.890 回答
0

尽管我看不到您在哪里设置 的值MyTime(我假设它在MakeSound?),但您是MyTime在 UI 线程以外的线程上设置 的值。您可能正在使用System.Timers.Timer该类,它不会在 UI 线程上执行事件处理程序。如果要System.Timers.Timer在其委托中使用和更改 UI ElapsedEventHandler,则需要使用SynchronizingObject计时器上的属性。有关详细信息,请参阅此 MSDN 文章:比较计时器类

于 2013-02-12T12:56:44.930 回答