Я занимаюсь разработкой проекта и использую шаблон-посредник для связи между 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 раз, вы можете себе представить :)
Как я мог предотвратить это?Должен ли я как-то убить сообщение?
Кажется, что оно написано очень плохо, меня сильно смутило сообщение (шаблон посредника), но я знаю, что если я привыкну, все будет гораздо проще.
Буду признателен за любую помощь или совет.
Спасибо