Должна ли каждая модель представления обрабатываться одним ViewModelLocator?

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

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

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


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

Проблема, которую я обнаружил, заключается в том, что если для каждого из моих представлений, соответствующих каждой модели представления, задан собственный контекст данных как ViewModelLocator.ViewModelx, экземпляр представления создается во время разработки, и это вызывает у меня проблемы, если во время конструктора моего представления мне нужно вызвать внешний класс, который получает данные из службы WCF. Выдает "ошибку создания экземпляра".

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

Итак, как правильно поступить и логический путь:

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

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


person serge    schedule 13.11.2011    source источник


Ответы (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>();
        }
    }
}
person htuomola    schedule 14.11.2011