PerformanceProgressBar“无效的跨线程访问”异常

时间:2012-01-20 06:22:58

标签: mvvm windows-phone-7.1 silverlight-toolkit multithreading

我正在开发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值时,我得到“无效的跨线程访问”异常。

有什么想法吗?

1 个答案:

答案 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事件。