ViewModel-первый подход к навигации Silverlight - PullRequest
0 голосов
/ 16 ноября 2011

Я ищу действительно несвязанный способ поддержки навигации в приложении Silverlight с использованием MVVM.Я пытаюсь выполнить более «пуристическую» реализацию шаблона, в которой пользовательский интерфейс полностью отделен от ViewModels, чтобы приложение могло работать полностью без пользовательского интерфейса.Для этого мне нужно поддерживать навигацию без проблем с пользовательским интерфейсом.

У меня есть несколько идей, как это сделать (с помощью обмена сообщениями и т. Д.), Но я не смог придумать хороший способ «сопоставить» представление сViewModel, чтобы пользовательский интерфейс мог отображать соответствующий View, когда ViewModel «отображается».Я помню, как однажды наткнулся на статью, в которой описывалось решение этой самой проблемы, но я не могу найти ее в Интернете.

Кто-нибудь знает, как найти эту статью, или есть опыт решения этой проблемы?

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Итак, вот мое несколько скучное описание того, что мы в итоге сделали:

Сначала мы решили использовать встроенную инфраструктуру навигации по страницам.У нас было несколько причин, но, поскольку он является встроенным и также является средой навигации в Windows 8, мы решили попробовать этот подход.

Я должен также упомянуть, что мы используем MVVM Light и MEF в наших приложениях,(Это вступает в игру ниже.)

Чтобы сделать это, мы создали оболочку приложения (UserControl), которая содержит элемент управления Frame.Для DataContext оболочки установлен экземпляр ShellViewModel, который предоставляет одно свойство CurrentPage (типа String).Затем мы привязываем свойство Source фрейма к CurrentPage.Этот подход похож на ViewModel уровня приложения Рэйчел.

ShellViewModel регистрируется в Messenger для получения сообщений CurrentPageChanged.Когда сообщение получено, свойство CurrentPage обновляется, возникает событие PropertyChanged и обновляется пользовательский интерфейс.Сообщение исходит из NavigationService (который реализует INavigationService и вводится / импортируется с использованием MEF).

NavigationService предоставляет метод NavigateTo, который принимает строковое имя ViewModel, представляющее пункт назначения.Это имя совпадает с именем контракта, примененным к ViewModel при экспорте (используя MEF) и используемому для поиска экземпляра с помощью нашего ViewModelLocator.

В методе NavigateTo мы используем ViewModelLocator, чтобы извлечь экземпляр ViewModel, вызвать Deactivate onтекущей ViewModel (если она есть), вызовите Activate для новой ViewModel, затем отправьте сообщение CurrentPageChanged с именем нового представления в качестве параметра.Activate / Deactivate - это вспомогательные методы в ViewModel, которые позволяют нам выполнять любые необходимые задачи, когда ViewModel перемещается в или из.

Это, кажется, работает хорошо и дает нам очень реализацию MVVM-ish со всей навигациейизолированный от наших ViewModel через INavigationService и обмен сообщениями.

Единственный недостаток в настоящее время заключается в том, что, хотя мы используем строковые константы в коде для представления имен ViewModel, мы все еще жестко кодируем строки в представленияхустановить DataContext.Я буду искать способ автоматической установки DataContext как части навигационного «инструмента».

Следует отметить, что этот подход был проанализирован из ряда источников, включая (но не ограничиваясь ими)к) Рейчел и следующие ссылки:

http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/01/25/adapting-silverlight-navigation-to-mvvm.aspx

http://blog.galasoft.ch/archive/2011/01/06/navigation-in-a-wp7-application-with-mvvm-light.aspx

http://www.geoffhudik.com/tech/2010/10/10/another-wp7-navigation-approach-with-mvvm.html

1 голос
/ 18 ноября 2011

Обычно у меня есть ViewModel для всего приложения, и оно содержит CurrentPage и всю обработку событий навигации.

На стороне View я использую ContentControl с его Content привязан к CurrentPage, и используйте DataTemplateSelector, чтобы определить, какие View отображать, для каких ViewModel

Здесь есть пример здесь , если вам интересноон использует DataTemplates вместо DataTemplateSelector.

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