簡體   English   中英

使用WPF MVVM Light DispatcherHelper

[英]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線程中的_ServiceStatus(在viewmodel的構造函數中),ui會更新。

我的問題是:是不是DispatcherHelper.CheckBeginInvokeOnUI有避免這個問題? 我究竟做錯了什么? 謝謝!

你應該在UI線程上創建Colore畫筆,或者在后台線程上調用它的Freeze方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM