WP7 - Использование Messenger.Default.Send (pageuri) во ViewModel. Не регистрируясь нигде на это сообщение, по-прежнему работает навигация. Как? - PullRequest
2 голосов
/ 25 июля 2010

Я использую MVVM Light инструментарий класса "Messenger" -

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

В частности: public virtual void Send (сообщение TMessage); где TMessage - строка для Uri представления / страницы в приложении.

Описание метода указывает:

// Summary:
    Sends a message to registered recipients. **The message will reach all recipients
     that registered for this message type using one of the Register methods.**

 Parameters:
   message:
     The message to send to registered recipients.

 Type parameters:
   TMessage:
     The type of message that will be sent.

В моем коде ViewModel у меня есть что-то вроде этого:

string viewuri = "/View/Page1.xaml";
Messenger.Default.Send(viewuri );

Если я зарегистрируюсь, чтобы получить это сообщение в View, и попробую перемещаться, используя что-то вроде:

NavigationService.Navigate(new Uri(viewuri, UriKind.Relative));

Я получаю исключение: Первое случайное исключение типа «System.InvalidOperationException» произошло в Microsoft.Phone.Controls.Navigation.dll

Но, если я НЕ регистрируюсь, чтобы получить это сообщение где-либо в коде, то навигация работает без проблем. Может кто-нибудь объяснить мне это? Как это сообщение, содержащее Uri, обрабатывается системой?

Спасибо.

Обновление: пожалуйста, смотрите мой комментарий ниже. Я думаю, что в моем коде есть какая-то проблема, как я отменяю регистрацию мессенджера (MainPage). Зарегистрируйтесь в ctor:

  public MainPage()
    {
        InitializeComponent();
        Messenger.Default.Register<string>(this, m => MessageHandler(m));
        SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape;

    }

Отмена регистрации в обработчике сообщений после получения сообщения в классе MainPage:

      private void MessageHandler(string message)
    {
            NavigationService.Navigate(new Uri(message, UriKind.Relative));
            Messenger.Default.Unregister<string>(this, m => MessageHandler(m));
    }

1 Ответ

3 голосов
/ 25 июля 2010

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

В любом случае, в этом случае вам вообще не нужен анонимный метод, вы можете напрямую зарегистрировать MessageHandler в качестве обработчика:

Messenger.Default.Register<string>(this, MessageHandler);

...

Messenger.Default.Unregister<string>(this, MessageHandler);
...