我正在开发一个项目,我正在使用中介模式在viewModel和View之间进行通信。
问题在于,使用与消息一样多次执行的消息注册的方法。
好吧,让我们写下我的问题。
从一个简单的菜单中我有一个项目,我已经为它分配了一个命令
//MainWindow.xaml
<awc:ImageButton IsToolStyle="True" Orientation="Vertical" ImageSource="" Command="{Binding ShowPricesWindowCommand}">Prices</awc:ImageButton>
//MainWIndow ViewModel
public ICommand ShowPricesWindowCommand {
get { return new RelayCommand(ShowPricesWindowExecute); }
}
void ShowPricesWindowExecute() {
Messenger.Default.Send(new NotificationMessage<Hotel>(this, SelectedHotel, "ShowPricesWindow"),
"ShowPricesWindow");
}
//MainWindow.xaml.cs
Messenger.Default.Register<NotificationMessage<Hotel>>(this, "ShowPricesWindow", HotelPriceMessageReceived);
private void HotelPriceMessageReceived(NotificationMessage<Hotel> selectedHotel) {
var roomPrices = new RoomPrices();//This view has the RoomPriceViewModel as dataContext
roomPrices.Show();
//via messaging I am sending the selectedHotel object
Messenger.Default.Send(new NotificationMessage<Hotel>(this, selectedHotel.Content, "ShowPricesWindow"),
"ShowPricesWindow2");
}
从RoomPricesViewModel我做了一个简单的计算,我需要关闭视图,然后打开另一个。
public RoomPricesViewModel(IDialogService dialogService) {
this._dialog = dialogService;
Messenger.Default.Register<NotificationMessage<Hotel>>(this, "ShowPricesWindow2", NotificationMessageReceived);
}
private void NotificationMessageReceived(NotificationMessage<Hotel> selectedHotel) {
this.SelectedHotel = selectedHotel.Content;
LoadRooms();
}
void LoadRooms() {
if (rooms.Count == 0) {
dialogResponse = _dialog.ShowMessage("Display a message;", "", DialogButton.YesNo, DialogImage.Warning);
switch (dialogResponse) {
case DialogResponse.Yes:
//close the RoomPrices window and open the RoomTypesWindow
Messenger.Default.Send(new NotificationMessage<Hotel>(this, this.SelectedHotel, "CloseWindowAndOpenRoomTypes"), "CloseWindowAndOpenRoomTypes");
return;
break;
case DialogResponse.No:
break;
}
}
}
代码似乎有效但如果我点击按钮,视图正在打开,它会提示我一个消息框,如果我单击是,则当前视图关闭,另一个正在打开。
如果再次单击该按钮,则会关闭窗口并打开两个窗口而不是一个窗口。
如果点击10次,你可以想象:)
我怎么能阻止这个? 我必须以某种方式杀死这条消息吗?
它似乎写得非常糟糕,我对消息传递(中介模式)感到很困惑,但我知道如果我习惯它,事情就会容易得多。
我将不胜感激任何帮助或建议。
由于
答案 0 :(得分:0)
<强>解决方案强>
问题在于我在窗口的构造函数中注册了消息,并且多次打开窗口消息已经注册了很多次。 因此,窗口打开的次数是“NotificationMessage”的注册次数。
我简单地运行这个
public RoomPricesViewModel(IDialogService dialogService) {
Messenger.Default.Register<NotificationMessage<Hotel>>(this, "ShowPricesWindow", NotificationMessageReceived);
}
private void NotificationMessageReceived(NotificationMessage<Hotel> selectedHotel) {
//code
Messenger.Default.Unregister(this);
}
问题解决了。