Using WPF MVVM Light DispatcherHelper



我有一个WPF应用程序,其中某些控件属性与相对ViewModel中的属性绑定。

这是相关的XAML代码:

[..]
<StackPanel>
    <Ellipse Width="20" Height="20" Fill="{Binding ServiceStatus.Colore}"/>
    <TextBlock Text="{Binding ServiceStatus.Stato}" FontSize="8"></TextBlock>
</StackPanel>
[..]

这是DTO:

public class StatusDTO
{
    public Service.StatoServizio ServiceStatus { get; set; }
    public string Stato { get; set; }
    public SolidColorBrush Colore { get; set; }
}

这是ViewModel:

public class MainViewModel : ViewModelBase
{
    private StatusDTO _ServiceStatus;
    public StatusDTO ServiceStatus 
    {
        get { return _ServiceStatus; }
        set { _ServiceStatus = value; }
    }
    public MainViewModel()
    {   
        [...]         
        _ServiceStatus = new StatusDTO();
        _ServiceStatus.ServiceStatus = SS_UNKNOWN;
        _ServiceStatus.Stato = "INITIALIZING...";
        _ServiceStatus.Colore = new SolidColorBrush(Colors.Gray);
        CheckServiceStatus();
        [...]
    }
    private void CheckServiceStatus()
    {
        ThreadPool.QueueUserWorkItem(o =>
           {
               Service.StatoServizio ss = SS_UNKNOWN;
               while (true)
               {
                   Thread.Sleep(5000);
                   ss = Service.ServiceManager.GetServiceStatus();
                   if (_ServiceStatus.ServiceStatus == ss)
                       continue;
                   _ServiceStatus.ServiceStatus = ss;
                   switch (_ServiceStatus.ServiceStatus)
                   {
                       case SS_STOPPED:
                           _ServiceStatus.Stato = "STOPPED";
                           _ServiceStatus.Colore = new SolidColorBrush(Colors.Red);
                           break;
                      [...]
                   }
                   DispatcherHelper.CheckBeginInvokeOnUI(() => { RaisePropertyChanged("ServiceStatus"); });  <----- HERE I GOT THE EXCEPTION
               }
           });                  
    }

dispatcherHelper在app.xaml.cs

中初始化

代码在 dispatcherhelper.checkbegininvokeonui 中执行lambda时,我得到了此例外:

Must create DependencySource on same Thread as the DependencyObject

如果我更新UI线程(如ViewModel的构造函数)中的_servicestatus,则UI会更新。

我的问题是:不是 dispatcherhelper.checkbegininvokeonui 避免了这个问题吗?我究竟做错了什么?谢谢!

您应该在UI线程上创建Colore刷子,或在背景线程上调用其Freeze方法:

case SS_STOPPED:
_ServiceStatus.Stato = "STOPPED";
_ServiceStatus.Colore = new SolidColorBrush(Colors.Red);
_ServiceStatus.Colore.Freeze(); // <--
break;

相关内容

  • 没有找到相关文章

最新更新