我有这些:
我想更新属性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; });
但textBox永远不会更新
答案 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)