Должна ли каждая модель представления обрабатываться одним ViewModelLocator? - PullRequest
1 голос
/ 13 ноября 2011

Я начинаю изучать MVVM light и начинаю проектировать мои разные модели viemModels. Я долго искал, чтобы найти то, что я ищу, но я не мог получить это: - (.

Один пример, который я имею, основан на единственной MainViewModel, которая обрабатывается внутри ModelViewLocator. В большинстве случаев у нас будет более одного viewModel, поэтому должны ли все viewModel быть определены в одном файле ViewModelLocator или мне нужно иметь один ViewModelLocator на представление?

Другими словами, нужно ли мне получить это: MainViewModel -> MainViewModelLocator PictureViewModel -> PictureViewModelLocator


Хорошо, хорошо, но один вопрос: скажем, у меня есть 3 модели представления, которые я создал как ViewModel1, 2 и 3 В ViewModelLocation я создал ту же структуру, что и MainViewModel, чтобы создать его экземпляр, и создал главное свойство для доступа к экземпляру Models.

Проблема, которую я обнаружил, заключается в том, что если для каждого из моих видов View, соответствующих каждому viewModels, задан собственный datacontext как ViewModelLocator.ViewModelx, экземпляр представления создается во время разработки, и это создает мне проблемы, если во время конструктора моего представления Мне нужно вызвать внешний класс, который получает данные из службы WCF. Он генерирует «ошибку создания экземпляра».

С другой стороны, если в каждом представлении я выполняю привязку, то НЕ из ViewModelLocator.ViewModelx, а вместо этого как непосредственно ViewModelx, тогда я не получаю эту ошибку и работает лучше.

Так что же делать и логический путь:

1 - Должна ли MainViewModel создавать все другие viewModel? 2 - Должен ли каждый View быть привязан к своей собственной собственности MainStatic в ViewModelLocator? 3 - Создает ли каждый вид свой собственный экземпляр ViewModel?

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

1 Ответ

4 голосов
/ 14 ноября 2011

Обычно нет необходимости в нескольких локаторах моделей представлений. Обычным способом является создание одного 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>();
        }
    }
}
...