Как иметь несколько пар “Представление-ViewModel”?

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

Значение по умолчанию ViewModelLocator реализации ViewModels как одиночные элементы, поэтому различные экземпляры того же Представления свяжут с тем же ViewModel.

Я мог создать ViewModel в VMLocator как нестатический объект (как простой как возврат нового VM ()...), но это только частично поможет мне. На самом деле я все еще должен отслеживать открытые окна. Тем не менее, каждое окно могло бы открыть несколько других окон (другого вида, хотя). В этой ситуации я, возможно, должен был бы выполнить некоторую операцию на родительском Представлении и всех его детях. Например, прежде, чем закрыть Представление P, я мог бы хотеть закрыть все его дочерние элементы (представление C1, представление C2, и т.д.).

Следовательно, там какой-либо простой и легкий путь состоит в том, чтобы достигнуть этого? Или есть ли какая-либо лучшая практика, которой Вы были бы совет меня для следования?

Заранее спасибо за Вашу драгоценную справку.

Удачи,
Gianluca.

12
задан MasterMastic 5 August 2013 в 18:35
поделиться

1 ответ

Нет никаких обязательств по хранению ViewModels как одиночных в ViewModelLocator, но он конечно, их легче найти , если представление тоже одноэлементное . Очевидно, что если у вас есть несколько экземпляров одного и того же класса View, у вас будет несколько экземпляров одного и того же класса ViewModel, и он больше не может быть синглтоном.

Чтобы отслеживать несколько экземпляров ViewModel, вы можете реализовать словарь в ViewModelLocator, который ищет ViewModel в соответствии с ключом. Ключ может быть, например, уникальным идентификатором представления. Как только вы получите представление, получите его ключ, а затем получите модель представления из локатора.

Обновление : Часто вам даже не нужно отслеживать несколько моделей просмотра. Например, вы можете заставить класс Messenger отправлять сообщение всем экземплярам данного класса viewmodel с помощью перегрузки Send.Поэтому, прежде чем внедрять словарь для отслеживания виртуальных машин, спросите себя, действительно ли он вам нужен! ;)

Надеюсь, что это поможет, Лоран

11
ответ дан 2 December 2019 в 22:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: