我正在开发WP7应用程序。我遇到了一些意外的行为。我在几个页面中的应用程序中使用SilverLight toolktit中的PerformanceProgressBar。这些PerformanceProgressBars绑定到名为IsBusy的ViewModel属性。每个页面都有自己的ViewModel。
....<toolkit:PerformanceProgressBar
VerticalAlignment="Top"
HorizontalAlignment="Left"
IsIndeterminate="{Binding IsBusy}"
Visibility="{Binding IsBusy, Converter={StaticResource BoolToVisibilityConverter}}"
/>......
public bool IsBusy
{
get
{
return this._isBusy;
}
set
{
if (value == this._isBusy)
{
return;
}
this._isBusy = value;
RaisePropertyChanged("IsBusy");
}
}
当我更改IsBusy值时,我得到“无效的跨线程访问”异常。
有什么想法吗?
答案 0 :(得分:3)
必须从UI线程执行对可视树的任何更改,即应用程序的UI。这包括对通过绑定发生的属性的更改。我的猜测是你通过后台线程更新这个属性?
在这种情况下,您需要通过Dispatcher将属性更改封送到UI线程。
public bool IsBusy
{
get
{
return this._isBusy;
}
set
{
if (value == this._isBusy)
{
return;
}
Application.Current.Dispatcher.BeginInvoke(() => {
this._isBusy = value;
RaisePropertyChanged("IsBusy");
});
}
}
这会将视图暴露给你的视图模型,所以MVVM不是很好!在这种情况下,我会将调度程序“隐藏”在您提供给ViewModel的单个方法接口IMarshalInvoke后面。
或者考虑使用BackgroundWorker,它可以为你的UI线程触发ProgressChanged事件。