0

私はWP7アプリケーションを開発しています。私は予想外の動作に出会った。私はいくつかのページで私のアプリでSilverLightのtoolktitからPerformanceProgressBarを使用します。これらのPerformanceProgressBarsはIsBusyというViewModelプロパティにバインドされています。各ページには独自のViewModelがあります。PerformanceProgressBar "無効なクロススレッドアクセス"例外

....<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値を変更すると、私は "無効なクロススレッドのアクセス" の例外を取得します。

アイデア?

答えて

3

アプリケーションのUIであるビジュアルツリーの変更は、UIスレッドから実行する必要があります。これには、バインディングを介して発生するプロパティの変更が含まれます。私の推測では、このプロパティをバックグラウンドスレッド経由で更新していますか?

この場合、ディスパッチャを介してプロパティの変更を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という単一のメソッドインタフェースの背後にあるディスパッチャを「非表示」にします。

また、ProgressChangedイベントをUIスレッドに送信できるBackgroundWorkerの使用を検討してください。

+0

あなたの推測は正しいです。私はAsync webserviceメソッドを呼び出しています。ここでは、IsBusyプロパティが結果CallBackでfalseに変更されています。 IMarshaledInvokeの提案をもっと詳しく説明できますか? –

関連する問題