【问题标题】:WPF MVVM PropertyChanged notifications in the ViewModel triggered by Model Events模型事件触发的 ViewModel 中的 WPF MVVM PropertyChanged 通知
【发布时间】:2013-01-27 04:29:49
【问题描述】:

我在理解如何将模型类中的属性更改事件通过 ViewModel 向上传播到视图中时遇到问题。我正在尝试遵守 MVVM 模式,所以请记住这一点。

我有一个试图通过 ViewModel 公开的模型。我的 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 分钟,因此我的 ServerStatusApiRequest 对象每 3 分钟就会有新的数据。我在所有 ApiRequest 类中公开了一个 UpdatedResults 事件,以便在新数据进入时进行通知。

现在我希望我的 ViewModel 有一个 ServerStatusApiRequest 的实例并绑定到它的 ServerStatusHelperClass Status 属性,并在每次更新信息时及时了解更改,但我的视图(用于绑定)无法知道关于我的模型,因此不知道我的UpdatedResults 课程中的UpdatedResults 事件。如何通过我的 ViewModel 将其反映到视图中?我在这里做了什么完全奇怪的事情吗?

这是我所拥有的半工作但我觉得这是一个非常hacky的解决方案:

在我的 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,只是在它不知道的情况下,我还是想触发该事件。

我觉得我在这里错过了一个关键概念,以便更轻松地将这一切联系在一起。

感谢您的任何意见。

【问题讨论】:

  • 不幸的是,你就是这样做的。
  • @RyanByrne 请查看我提供的答案,我会对您的想法感兴趣。

标签: c# wpf data-binding mvvm mvvm-light


【解决方案1】:

我遇到了一种更好的方法来实现我正在寻找的行为。这是我的 ViewModel 中的代码:

    private ServerStatusRequest _eveServerStatus = new ServerStatusRequest();

    public ServerStatusRequest EveServerStatus
    {
        get
        {
            return _eveServerStatus;
        }
    }

我的 ViewModel 和我的 View 都不应该更改这些数据。在我的ServerStatusRequest 类中,我有一个属性公开ServerStatusHelperClass 对象,如问题所示。我已经更改了ServerStatusHelperClass 并使其实现INotifyPropertyChanged 如下:

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

ObservableObject 只是一个简单的类,它为我从 mvvmlight 实现了INotifyPropertyChanged

通过这样做,当我的 ApiRequest 类修改它的 ServerStatusHelperClass 对象时,我的视图会自动更新。

欢迎对此解决方案提出意见。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 2011-02-11
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多