Подтвердить что ты не робот

Как иметь несколько пар "View-ViewModel"?

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

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

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

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

Заранее благодарим за вашу драгоценную помощь.

Приветствия,
Джанлука.

4b9b3361

Ответ 1

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

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

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

Надеюсь, что это поможет, Laurent

Ответ 3

У меня возникла проблема, которая была отправлена ​​и решена в этом вопросе SO. Оказалось, что он очень сильно связан с мнением г-на Бугниона (это очень помогло мне, спасибо!)

Что я нашел, вам не нужно хранить свойство view-model в ViewModelLocator вообще. Просто используйте ServiceLocator, чтобы создать экземпляр с ключом, а в вашей "Диалоговой службе" передайте ключ в ShowDialog<T>(string key = null).

Кроме того, как уже упоминалось в этом потоке, используйте метод Messenger.Default.Send и не забудьте впоследствии вызвать viewModel.Cleanup(), чтобы отменить регистрационную модель из Messenger, тем самым предотвращая попытки моделей моделей phantom пытаться обработать будущие сообщения отправляется во все экземпляры типа класса модели представления.