Как я могу получить NavigationService, не будучи Страницей? - PullRequest
2 голосов
/ 28 февраля 2011

Кажется, это действительно наивный вопрос, но как же получить NavigationService извне страницы, как, скажем, модель представления?Все говорят, что навигация должна происходить в представлении, но я продолжаю думать, что это не веб-страница, а приложение.Модель представления и бизнес-логика должны контролировать поток приложения, а не представление.Это на самом деле наивно?

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

Насколько я понимаю, операции с представлением, т. Е. Пользовательским интерфейсом, должны выполняться исключительно представлением. При работе с MVVM пользовательский интерфейс не должен напрямую контролироваться ViewModel или BusinessLogic (поскольку они не должны ничего знать о конкретной реализации View), а должен работать с сообщениями.

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

Альтернативой этому было бы использование DialogService или чего-то подобного, который обрабатывает открытие окон в центральном месте. Однако, поскольку NavigationService является свойством класса Page, нам необходимо обработать сообщение на странице.

Пример кода с использованием MVVM Light Toolkit : (не тестировался, частично взят из примера RiaXBoxGames Шона Вильдермута ):

ViewModel (например, поместить это в команду для кнопки):

Messenger.Default.Send<bool>(true, "GoToNextPage");

Просмотр (например, поместить это в конструктор):

Messenger.Default.Register<bool>(this, "GoToNextPage", ignore =>
{
  // your code to go to next page
});
1 голос
/ 14 марта 2011

другой вариант - создать событие во ViewModel, запустить это событие при возникновении команды и подписать View на это событие. Внутри EventArgs вы можете указать, к какой странице переходить и т. Д. Я думаю, что это простое и тестируемое решение.

Роберт

0 голосов
/ 06 января 2012

Я просто передаю ссылку на фрейм при создании модели представления.

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