MVVM指示灯,应该手动杀死来自中介模式的消息?

时间:2011-02-17 17:31:10

标签: wpf mvvm

我正在开发一个项目,我正在使用中介模式在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 :(得分: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);
    }

问题解决了。