Mvvm PerformanceProgressBar“;无效的跨线程访问“;例外
我正在开发WP7应用程序。我遇到了一些意想不到的行为。我使用SilverLight toolktit中的PerformanceProgressBar在我的应用程序中使用了几个页面。这些PerformanceProgressBars绑定到名为IsBusy的ViewModel属性。每个页面都有自己的ViewModelMvvm PerformanceProgressBar“;无效的跨线程访问“;例外,mvvm,windows-phone-7.1,silverlight-toolkit,multithreading,Mvvm,Windows Phone 7.1,Silverlight Toolkit,Multithreading,我正在开发WP7应用程序。我遇到了一些意想不到的行为。我使用SilverLight toolktit中的PerformanceProgressBar在我的应用程序中使用了几个页面。这些PerformanceProgressBars绑定到名为IsBusy的ViewModel属性。每个页面都有自己的ViewModel ….. public bool IsBusy { get { return this._isBusy;
…..
public bool IsBusy
{
get
{
return this._isBusy;
}
set
{
if (value == this._isBusy)
{
return;
}
this._isBusy = value;
RaisePropertyChanged("IsBusy");
}
}
当我更改IsBusy值时,会出现“无效的跨线程访问”异常
任何想法?对可视化树(即应用程序的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后面“隐藏”调度程序
或考虑使用后台工作人员,可以将更改的事件推到UI线程上。
< P>对可视化树的任何更改,即应用程序的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后面“隐藏”调度程序
或考虑使用后台工作人员,可以将更改的事件推到UI线程上。
您的猜测是正确的。我正在调用异步webservice方法,其中IsBusy属性在结果回调中更改为false。你能解释一下你对伊玛沙莱丁沃克的建议吗?你的猜测是正确的。我正在调用异步webservice方法,其中IsBusy属性在结果回调中更改为false。你能解释一下你对伊玛沙莱丁沃克的建议吗?