我有一个奇怪的问题。Mvvm Light Messenger消息从未收到
我正在使用GalaSoft的MVVM Light框架,目前为止一切正常。 我使用信使系统发送ViewModels之间的消息就好了,直到我试图做到以下几点:
我有一个单一类,GateKeeper
,发送消息。
这个类不是一个ViewModel,因此不会从ViewModelBase
继承。
如果它发送消息,它不会被接收到任何地方。
我曾尝试以下:
- 从
ViewModeBase
让GateKeeper
继承 - >没有成功。 - 注册
GateKeeper
接收消息,从而看看它是否会接收/接收实际发送的消息 - >没有成功。 - 从辛格尔顿更改
GateKeeper
正常实例 - >没有成功 - 创建未连接到一个视图MVVM视图模型,并让它发送邮件,就像
GateKeeper
- >没有成功
所有我的viewModel连接到一个视图可以发送消息,他们将被接收。
它几乎看起来像一个视图模型必须“链接”到信使工作前的视图,但伊莫。这是一个主要限制。
下面是当前非常简化的设置。
在GateKeeper上调用ApplicationInitialize不会触发在mainviewmodel上接收到的消息,也不会触发GateKeeper类自身。
我希望有人对这个问题有建议。
谢谢..
示例设置: MainViewModel构造:
public MainViewModel()
{
Messenger.Default.Register<LoadViewMessage>(this, (message) =>
{
if (message.Sender is GateKeeper) CurrentView = message.View;
else if (message.Sender is LoginViewModel) CurrentView = message.View;
else if (message.Sender is MenuItemBarViewModel) CurrentView = message.View;
});
网闸:
public class GateKeeper : IGateKeeper
{
private readonly IEmployeeService _employeeService;
#region Implementation of IGateKeeper
public void ApplicationInitialize()
{
Messenger.Default.Send<LoadViewMessage>(new LoadViewMessage(ObjectLocator.MainMapView), this);
}
public void LoginSucceeded(Employee employee)
{
//This is where we retrieve the available services for the current employee
//TODO: add methods for retrieving service info from backend
//Send a message that should make the mainview load the map into its currentview property
Messenger.Default.Send(new LoadViewMessage(ObjectLocator.MainMapView), this);
}
#endregion
public GateKeeper(IEmployeeService employeeService)
{
_employeeService = employeeService;
//Test.. Is not triggered
//Just used for debugging, thus nothing happens inhere.
Messenger.Default.Register<LoadViewMessage>(this, (message) =>
{
if (message.Sender is GateKeeper) ;
else if (message.Sender is LoginViewModel) ;
else if (message.Sender is MenuItemBarViewModel);
});
}
消息类别:LoadViewMessage
public class LoadViewMessage : MessageBase
{
public UserControl View { get; protected set; }
public LoadViewMessage(UserControl view, object sender): base(sender)
{
View = view;
}
public LoadViewMessage(UserControl view):this(view, null){}
}
PS:ObjectLocator是处理指出,问题在发送方法,谎称对象的所有实例和它们的生命周期
@UPDATE LBugnion(MVVM光的生成器)一个NinJect类,其中i实际上是使用一个带有令牌的Send的重载。
@this不会在我的情况下工作
Messenger.Default.Send(new LoadViewMessage(ObjectLocator.MainMapView), this);
@this会顺利
Messenger.Default.Send(new LoadViewMessage(ObjectLocator.MainMapView, this));
这本来是要传递给loadViewMessage,而不是发送方法为代币
我不知道为什么你的代码不能正常工作,但我可以告诉你,它应该。消息传递系统与ViewModel/View关系无关。 – jv42
您是否调试过(断点)GateKeeper方法?例如,你正在使用一个非默认构造函数(带参数),它是否被调用? – jv42
Excatly。它应该可以工作,而且当我在视图中使用的其他视图模型中使用它时也可以。 我调试了所有的GateKeeper构造函数。我不知道为什么它不能在这里工作。 – ThBlitz