UI未通过计时器方法在Windows Phone 7中更新

时间:2012-02-27 21:35:59

标签: c# windows-phone-7 xaml

我正在使用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;  

         }
    }

像魅力一样!

1 个答案:

答案 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。