我在理解如何将模型类中的属性更改事件通过 ViewModel 向上传播到视图中时遇到问题。我正在尝试符合 MVVM 模式,所以请记住这一点。
我有一个试图通过 ViewModel 公开的模型。我的模型类查询 Api 调用以获取服务器状态并在公共属性中公开该状态。前任:
public class ServerStatusRequest : ApiRequest
{
//Exposable properties by request
public ServerStatusHelperClass Status { get; set; }
WhereServerStatusHelperClass
只是查询中组合结果的包装器:
public class ServerStatusHelperClass
{
public bool ServerStatus { get; set; }
public int OnlinePlayers { get; set; }
我的 ApiRequest 基类最酷的地方在于它检查特定 Api 调用的缓存时间并使用 System.Timers.Timer 更新结果。因此,例如,ServerStatus Api 调用在 Api 上缓存了 3 分钟,因此每 3 分钟我的ServerStatusApiRequest
对象就会有新的数据。我UpdatedResults
在所有 ApiRequest 类中公开一个事件,以便在新数据进入时进行通知。
现在我希望我的 ViewModel 有一个实例ServerStatusApiRequest
并绑定到它的ServerStatusHelperClass Status
属性,并在每次更新信息时保持最新的更改,但是我的视图(用于绑定)不知道我的模型,因此,不不知道我UpdatedResults
在ApiRequest
课堂上的活动。如何通过我的 ViewModel 将其反映到视图中?我在这里做一些完全奇怪的事情吗?
这是我所拥有的半工作但我觉得这是一个非常hacky的解决方案:
在我的视图模型中:
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);
如您所见,这似乎非常多余。而且我还遇到了一个问题,我不得不注释掉 setter 中的检查,EveServerStatus
因为那时它_eveServerStatus
已经更新为value
只是在它不知道的情况下,我还是想触发该事件。
我觉得我在这里错过了一个关键概念,以便更容易地将这一切联系在一起。
感谢您的任何意见。