MVVM-Light Locator Pattern и многоразовый пользовательский контроль - PullRequest
1 голос
/ 23 июня 2010

У меня есть приложение Silverlight 4, которое я пытаюсь преобразовать, чтобы использовать шаблон локатора и библиотеку MVVM-Light.

Насколько я понимаю, класс MvvmLocator хранит ссылку на каждую модель представления и позволяет связывать DataContext каждого представления с соответствующей моделью представления в локаторе.

Мое приложение использует фрейм навигации, и, следовательно, каждая страница в приложении представляет собой UserControl, который загружается в фрейм контента.

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

Например, у меня есть страница поиска, которая состоит из 2 пользовательских элементов управления. Первый - это элемент управления параметрами поиска, который содержит несколько взаимозависимых комбинированных полей и кнопку поиска. Второе - это сама таблица результатов. Модель представления страницы, которая содержит эти 2 элемента управления, обрабатывает связь между ними. Проблема заключается в том, что этот элемент управления поиском используется и на других страницах, и если все они используют один и тот же экземпляр модели представления, это вызовет все виды головной боли. Таким образом, использование обычного «DataContext = {Binding ProductSearch, Source = {StaticResource Locator}}» кажется невозможным ...

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

Я новичок во всем мире Silverlight и MVVM, поэтому, может быть, я что-то упускаю из-за того, как все это должно быть структурировано или нарисовало себя в углу. Я просто не уверен. Я определенно приветствую любые предложения.

1 Ответ

2 голосов
/ 23 июня 2010

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

Некоторыми примерами использования INavigationContentLoader являются Дэвид Полл Открытие Silverlight 4 Navigation: Введение в INavigationContentLoader или Майк Silverlight 4 Грубые заметки от Taultry: Контроль над навигацией сообщений в блоге.Эти сообщения только показывают, как создать свой собственный загрузчик контента;использование его для перезагрузки существующих представлений зависит от вас.

...