Должна ли каждая модель представления обрабатываться одним ViewModelLocator?
Я начинаю изучать MVVM light и начинаю проектировать мои разные модели viemModels. Я долго просматривал, чтобы найти то, что я ищу, но я не мог получить это:-(.
Один пример, который я имею, основан на единственном MainViewModel, который обрабатывается внутри ModelViewLocator. В большинстве случаев у нас будет более одного viewModel, поэтому должны ли все viewModel быть определены в одном файле ViewModelLocator или мне нужно иметь один ViewModelLocator для каждого представления?
Другими словами, мне нужно получить это: MainViewModel -> MainViewModelLocator PictureViewModel -> PictureViewModelLocator
Хорошо, хорошо, но все же один вопрос: допустим, у меня есть 3 viewModel, которые я создал как ViewModel1, 2 и 3. В ViewModelLocation я создал ту же структуру, что и MainViewModel, чтобы создать его экземпляр, и должен создать главное свойство для Доступ к моделям экземпляров.
Проблема, которую я обнаружил, заключается в том, что если для каждого из моих представлений, соответствующих каждому viewModels, задан собственный datacontext как ViewModelLocator.ViewModelx, экземпляр представления создается во время разработки, и это создает мне проблемы, если во время конструктора моего представления мне нужно вызвать внешний класс, который получает данные из службы WCF. Он генерирует "ошибку создания экземпляра".
С другой стороны, если в каждом представлении я связываю, то НЕ из ViewModelLocator.ViewModelx, а вместо этого как непосредственно ViewModelx, тогда я не получаю эту ошибку и работает лучше.
Так что же делать и логический путь:
1 - Должна ли MainViewModel создавать все другие viewModel? 2 - Должен ли каждый View быть связан со своей собственностью MainStatic в ViewModelLocator? 3 - Каждый View создает свой собственный экземпляр ViewModel?
Я сделал так, что мой View, который возвращает служебные данные из внешнего класса во время создания конструктора ViewModel, работает, только если я связываю его непосредственно с ViewModel, у него есть проблемы с этим?
1 ответ
Обычно нет необходимости в нескольких локаторах моделей представлений. Обычным способом является создание одного ViewModelLocator, который вы затем добавляете в Application.Resources
в App.xaml, поэтому он доступен для использования в любом месте приложения. Просто создайте свойство в ViewModelLocator для каждой используемой вами ViewModel.
Ниже приведен пример использования контейнера IoC в MVVM Light 4 (бета) для создания экземпляров моделей представления. Вы также можете обойтись без контейнера IoC, но в более сложных сценариях это определенно упростит ваш код:
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<DetailsViewModel>();
}
public MainViewModel MainViewModel
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
public DetailsViewModel DetailsViewModel
{
get
{
return ServiceLocator.Current.GetInstance<DetailsViewModel>();
}
}
}