我有一个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;