繁体   English   中英

Caliburn.micro-在另一个视图模型中通知属性改变的视图模型

[英]Caliburn.micro - notifying a viewmodel on property change in another viewmodel

我有一个连接到服务器并向其发送命令的程序。 在我的程序中,我有2个窗口,其中一个是带有文本框的工具栏,其中显示了当前状态(我们将其称为“ mainviewmodel”),另一个是一个登录窗口,该窗口接收用户名和密码并将我登录到服务器(我们将其称为“ loginviewmodel”)

现在,为了使mainviewmodel知道loginviewmodel,我使用以下代码:

[Import]
Private LoginViewModel loginViewModel;

午餐从mainviewmodel登录窗口我有以下功能:

public void Login()
{
    if (!loginViewModel.CanInvokeLogin)
        return;
    if (loginViewModel.IsActive)
    {
        loginViewModel.Focus();
    }
else
    {
        windowManager.ShowWindow(loginViewModel);
    }
}

如您所见-我在loginviewmodel中有一个名为CanInvokeLogin的属性,该属性指示登录是否正在进行。

在mainviewmodel上,我有一个向我显示当前客户端状态的属性(绑定到视图的文本框)

public string TextboxDescription
{
    get
    {
        switch (AvailabilityStatus.Type)
        {
            case AvailabilityStatusType.READY:
                return ("Ready");
            case AvailabilityStatusType.BREAK:
                return (AvailabilityStatus.Reason);
            case AvailabilityStatusType.DISCONNECTED:
                if (!loginViewModel.CanInvokeLogin)
                {
                    return ("Conencting");
                }
                return ("connected");
            default:
                return ("Please wait...");
            }
        }
    }
}

我的问题是-状态不会在视图上更新,除非

NotifyOfPropertyChange(() => TextboxDescription);

被调用,所以我需要在任何时候调用它

NotifyOfPropertyChange(() => CanInvokeLogin);

被调用,但这发生在不同的视图模型上。

那么,如何通知mainviewmodel caninvokelogin已更改? 我知道我可以使用eventAggregator并将消息从一个视图模型发送到另一个视图模型,但这听起来像是用大炮杀死苍蝇,我敢打赌,有一种更简单的方法,

有什么建议么?

处理财产变更事件

PropertyChanged事件只是一个事件,因此没有必要阻止您从另一个视图模型监听该事件。

this.loginViewModel.PropertyChanged += this.OnLoginPropertyChanged;

事件处理程序方法看起来像这样...

private void OnLoginPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "TextboxDescription") {
        // Do something.
    }
}

引发StatusChanged事件:

老实说,如果我自己执行此操作,我将只是在状态更改时从LoginViewModel触发事件,然后改为处理这些事件,这似乎是一种更干净的解决方案。

this.loginViewModel.StatusChanged += this.OnLoginStatusChanged;

private void OnLoginStatusChanged(object sender, LoginStatusChangedEventArgs e)
{
    // Do something.
    switch (e.StatusType)
    {
        ...
    }
}

我会像这样自定义事件参数...

public class LoginStatusChangedEventArgs : EventArgs
{
     public AvailabilityStatusType StatusType { get; set; }
}

当状态更改且侦听器可以处理时,只需触发此事件即可。

事件汇总器:

您也可以使用事件聚合器,但是除非您有很多需要监听的断开连接的类,否则我可能会觉得这太过分了。

this.eventAggregator.Publish(new LoginStatusChangedMessage(AvailabilityStatusType.Disconnected));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM