![](/img/trans.png)
[英]Caliburn.micro: Deep property change INPC catching in ViewModel
[英]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.