MVVM light, Сообщения от паттерна-посредника должны быть убиты вручную? - PullRequest
0 голосов
/ 17 февраля 2011

Я занимаюсь разработкой проекта и использую шаблон-посредник для связи между 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 раз, вы можете себе представить :)

Как я мог предотвратить это?Должен ли я как-то убить сообщение?

Кажется, что оно написано очень плохо, меня сильно смутило сообщение (шаблон посредника), но я знаю, что если я привыкну, все будет гораздо проще.

Буду признателен за любую помощь или совет.

Спасибо

1 Ответ

0 голосов
/ 18 февраля 2011

Решение

Проблема заключалась в том, что я зарегистрировал в конструкторе окна сообщение и столько раз окно открывалось столько раз, сколько сообщений было зарегистрировано.Следовательно, окно открывалось столько раз, сколько было зарегистрировано «NotificationMessage».

Я просто запускаю это

public RoomPricesViewModel(IDialogService dialogService) {
        Messenger.Default.Register<NotificationMessage<Hotel>>(this, "ShowPricesWindow", NotificationMessageReceived);
    }

    private void NotificationMessageReceived(NotificationMessage<Hotel> selectedHotel) {
        //code
        Messenger.Default.Unregister(this);
    }

, и проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...