[英]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.