2012-06-27 61 views
1

我有一個屬性RaisePropertyChanged(PropName, oldValue, true, true)當我沒有任何連接到互聯網沒有更多,但它會拋出異常,我在錯誤的線程。 所以我想更新屬性窗體我的ViewModel,但我怎麼得到我的ViewModel中的當前線程或什麼是您的解決方案的建議?從另一個線程的ViewModel更新INotifyPropertyChanged屬性WinRT

我的視圖模型,構造函數

public MyViewModel() 
{ 
    // START LISTENING TO NETWORKSTATUS 
    NetworkInformation.NetworkStatusChanged += OnNetworkStatusChangedHandler; 
} 

NetworkChanged回調方法

private async void OnNetworkStatusChangedHandler(object sender) 
    { 
     ConnectionProfile profile = NetworkInformation.GetInternetConnectionProfile(); 

     if (profile == null) 
     { 
      IsRefreshEnabled = false; 
     } 
     else 
     { 
      IsRefreshEnabled = true; 
     } 

    } 

我的房屋

public const string IsRefreshEnabledPropertyName = "IsRefreshEnabled"; 
     private bool _isRefreshEnabled = true; 
     public bool IsRefreshEnabled 
     { 
      get { return _isRefreshEnabled; } 

      set 
      { 
       if (_isRefreshEnabled == value) { return; } 

       var oldValue = _isRefreshEnabled; 
       _isRefreshEnabled = value; 
       RaisePropertyChanged(IsRefreshEnabledPropertyName, oldValue, value, true); 
      } 
     } 

提前感謝!

回答

5

您需要更換RaisePropertyChanged呼籲:

await Dispatcher.RunAsync(DispatcherPriority.Normal,(){RaisePropertyChanged(IsRefreshEnabledPropertyName, oldValue, value, true)}); 

這將導致調用RaisePropertyChanged到UI線程上運行。

我假設你的類派生自Xaml控件(訪問控件上的Dispatcher屬性)。

+3

我認爲它很糟糕,把'Dispatcher.RunAsync'放在屬性的setter中,因爲它也會在UI線程中改變屬性時運行。它更好地改變'RunAsync'中的屬性。這種方法只在需要時調用... –

+0

完全公平的評論和一個很好的建議。 –

+0

你如何實現這個觀察集合? – Lance

相關問題