2013-02-11 41 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对象时。

此解决方案的输入是受欢迎的。