2013-02-12 93 views
1

我有这些:绑定文本框属性类

  • 上有一个标签
  • 类 “业务”
  • 类 “TimerHelper”

I A型我喜欢当我更新属性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; }); 

,但文本框永远不会更新

+0

我实在无法理解公务舱和时间助手之间的关系。你能告诉情景吗? – daryal 2013-02-12 12:46:40

+0

这是一种节拍器。我开始节奏,x秒,调用MyBusinessClass.MakeSound()方法,并且此方法将更新字段'MyTime'。当字段更新时,我想更新表格的文本框 – 2013-02-12 12:53:01

+0

你在哪里调用Invoke((MethodInvoker)delegate {myTextBox.Text = new MyBusinessClass()。MyTime;});? – Paparazzi 2013-02-12 12:54:58

回答

0

虽然我没有看到你在哪里设置的MyTime值(我假设它是在MakeSound?),你在其它线程设置的MyTime值比UI线程。您可能正在使用System.Timers.Timer类,该类不会在UI线程上执行事件处理程序。如果要使用System.Timers.Timer并更改其ElapsedEventHandler委托中的用户界面,则需要使用定时器上的SynchronizingObject属性。看到这个MSDN文章了解更多信息:Comparing the Timer Classes

+0

的确,我改变MakeTime中的MyTime() – 2013-02-12 13:02:31

1

我觉得你的问题是你正试图通过从其他线程databibding更新文本框。 我的意思是,你使用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); 
    } 
} 

}

相关问题