我正在使用Dispatch计时器设置每隔20秒触发一次我需要在我的视图模型中通过它的属性更新数据绑定文本块。这是viewmodel中的计时器代码:
public TestViewModel()
{
_dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Interval = new TimeSpan(0, 0, 20);
_dispatcherTimer.Tick += new EventHandler(_dispatcherTimer_Tick);
_dispatcherTimer.Start();
}
void _dispatcherTimer_Tick(object sender, EventArgs e)
{
if(blah == blah)
{
_dispatcher.BeginInvoke(() =>
{
// DoneEnabled is a boolean property that my
// textblock's IsEnabled property is bound to
DoneEnabled = true;
});
}
}
private bool _doneEnabled;
/// <summary>
/// Gets or sets a value indicating whether [done enabled].
/// </summary>
/// <value>
/// <c>true</c> if [done enabled]; otherwise, <c>false</c>.
/// </value>
public bool DoneEnabled
{
get { return _doneEnabled; }
set
{
_doneEnabled = value;
RaisePropertyChanged("DoneEnabled");
}
}
当我尝试在我的viewmodel中执行此操作时,通过在计时器的事件处理程序中更新此属性EXCEPT,可以在其他任何位置启用该按钮。不知道我在这里遗失了什么吗?
感谢。
更新:
将_dispatcherTimer_Tick方法编辑为以下
void _dispatcherTimer_Tick(object sender, EventArgs e)
{
if(blah == blah)
{
// DoneEnabled is a boolean property that my
// textblock's IsEnabled property is bound to
DoneEnabled = true;
}
}
像魅力一样!
答案 0 :(得分:1)
由于您使用DispatchTimer
方法_dispatcherTimer_Tick
已经在UI / Dispatcher线程上运行(这是为了方便使用而内置) - 只需执行:< / p>
void _dispatcherTimer_Tick(object sender, EventArgs e)
{
if(blah == blah)
{
DoneEnabled = true;
}
}
来自MSDN:
使用与System.Timers.Timer相对的DispatcherTimer的原因 是DispatcherTimer在与Dispatcher相同的线程上运行 并且可以在DispatcherTimer上设置DispatcherPriority。