2013-02-12 125 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); 
    } 
} 

}

相關問題