Я использую 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));
}