【发布时间】:2014-10-06 17:53:30
【问题描述】:
我有一个连接到服务器并向其发送命令的程序。 在我的程序中,我有 2 个窗口,其中一个是带有显示当前状态的文本框的工具栏(我们称之为“mainviewmodel”),另一个是一个登录窗口,它接收用户名和密码并将我登录到服务器(我们称之为“登录视图模型”)
现在,为了让 mainviewmodel 知道 loginviewmodel 我使用这个:
[Import]
Private LoginViewModel loginViewModel;
从主视图模型午餐登录窗口我有以下功能:
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 并从一个视图模型向另一个视图模型发送消息,但这听起来像是用大炮杀死苍蝇,我敢打赌有一个更简单的方法,
有什么建议吗?
【问题讨论】:
-
在这种情况下我会毫不犹豫地使用 eventtaggregator
-
如果有对视图模型的引用,为什么?只需使用普通的旧 .NET 事件。
-
聚合器有什么理由而不是像建议的那样注册事件?,eran?
-
如果您在应用程序范围内广播某些内容,事件聚合器是一个不错的工具...例如,当用户退出应用程序时,或者如果有很多用户登录时,我可能会使用事件聚合器系统周围的其他类需要对此类事件做出反应。不过,在您给出的示例中,简单的旧事件是一个很好的解决方案......就像你说的......不要用大炮杀死苍蝇。
-
最后我确实切换到使用 eventtaggregator - 使用事件导致我的程序爬行停止,突然随着每次断开和连接代表用户发送越来越多的 propertychange 事件,这可能是由于对于我写得不好的东西,所以我仍在测试它,但似乎使用 caliburn 消息优于使用事件,在这种情况下无论如何:)
标签: c# wpf mvvm viewmodel caliburn.micro