Должна ли каждая модель представления обрабатываться одним 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>();
        }
    }
}
Другие вопросы по тегам