2013-02-11 60 views
2

我在理解如何通過ViewModel傳播Model類中的屬性更改事件並進入視圖時遇到問題。我想要符合MVVM模式,請記住這一點。由模型事件觸發的ViewModel中的WPF MVVM PropertyChanged通知

我有一個模型,我試圖通過ViewModel公開。 My Model類查詢一個Api調用以獲取服務器狀態並在公共屬性中顯示該狀態。例如:

public class ServerStatusRequest : ApiRequest 
{ 
    //Exposable properties by request 
    public ServerStatusHelperClass Status { get; set; } 

哪裏ServerStatusHelperClass只是在查詢合併業績的包裝:

public class ServerStatusHelperClass 
{ 
    public bool ServerStatus { get; set; } 
    public int OnlinePlayers { get; set; } 

我的ApiRequest基類中的很酷的事情是,它會檢查特定的API調用的緩存時間並通過使用System.Timers.Timer更新結果。因此,例如,ServerStatus Api調用在Api上緩存3分鐘,因此每隔3分鐘我的ServerStatusApiRequest對象就會有新的數據。我在所有ApiRequest類暴露出UpdatedResults事件時,新的數據進來通知。

現在,我想我的ViewModel有中ServerStatusApiRequest一個實例,並綁定到其ServerStatusHelperClass Status財產和每一次熬夜與最新的變化信息已更新,但我的視圖(對於綁定)無法知道我的模型,因此,我不知道ApiRequest類中的我的UpdatedResults事件。我如何通過ViewModel將其反映到視圖中?我在這裏做了些什麼奇怪的事嗎?

這裏是我有什麼是半工作,但我覺得是一個非常哈克解決方案:

在我的ViewModel:

public const string EveServerStatusPropertyName = "EveServerStatus"; 
    private ServerStatusRequest _eveServerStatus = new ServerStatusRequest(); 
    public ServerStatusRequest EveServerStatus 
    { 
     get 
     { 
      return _eveServerStatus; 
     } 
     set 
     { 
      //if (_eveServerStatus == value) 
      //{ 
      // return; 
      //} 

      //RaisePropertyChanging(EveServerStatusPropertyName); 
      _eveServerStatus = value; 
      RaisePropertyChanged(EveServerStatusPropertyName); 
     } 
    } 

    public void UpdateEveServerStatus(object sender, EventArgs e) 
    { 
     EveServerStatus = (ServerStatusRequest)sender; 
    } 

而在的ViewModels構造我訂閱模式的事件:

EveServerStatus.UpdatedResults += new UpdatedResultsEventHandler(UpdateEveServerStatus); 

正如你所看到的,這看起來非常多餘。而且我還遇到了一個問題,那就是我必須在籌碼中註釋掉EveServerStatus,因爲那時_eveServerStatus已經更新爲value,但是沒有它知道,我想要發射這個事件。

我摔倒了,因爲我錯過了一個關鍵概念,可以更輕鬆地將這一切聯繫在一起。

感謝您的任何意見。

+0

不幸的是,你是如何做到的。 – 2013-02-11 23:46:21

+0

@RyanByrne請看我提供的答案,我會對你的想法感興趣。 – forTruce 2013-02-12 00:57:27

回答

1

我遇到了一個更好的方法來實現我正在尋找的行爲。這裏是我的ViewModel代碼:

private ServerStatusRequest _eveServerStatus = new ServerStatusRequest(); 

    public ServerStatusRequest EveServerStatus 
    { 
     get 
     { 
      return _eveServerStatus; 
     } 
    } 

沒有setter作爲我的ViewModel和我的視圖應更改此數據。在我的ServerStatusRequest類中,我有一個屬性暴露了ServerStatusHelperClass對象,如問題所示。我已經改變了ServerStatusHelperClass,並使其實現INotifyPropertyChanged像這樣:

public class ServerStatusHelperClass : ObservableObject 
{ 
    private bool _serverStatus; 
    public bool ServerStatus 
    { 
     get 
     { 
      return _serverStatus; 
     } 
     set 
     { 
      _serverStatus = value; 
      RaisePropertyChanged("ServerStatus"); 
     } 
    } 
... 

ObservableObject僅僅是一個簡單的類,我實現了INotifyPropertyChanged從mvvmlight。

通過這樣做,我的視圖會自動更新,當我的ApiRequest類修改它的ServerStatusHelperClass對象時。

此解決方案的輸入是受歡迎的。