我有一個奇怪的問題。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