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

你的猜測是正確的。我調用異步webservice方法,其中IsBusy屬性在結果CallBack中更改爲false。你能解釋一下你對IMarshaledInvoke的建議嗎? –

相關問題