Вопрос о ViewModel Management (время запуска DesignTime Vs)

У меня есть довольно простой интерфейс WPF, в результате которого пользовательские запросы открывают новую вкладку в моем TabControl. TabControl привязан к ObservableCollection<ViewModelBase>

Я добавляю экземпляры ViewModel в эту коллекцию, и соответствующий контент вкладки отображается на основе таких шаблонов:

    <DataTemplate DataType="{x:Type viewModels:UserUploadsViewModel}">
        <userControls:UserUploads />
    </DataTemplate>

Теперь скажем, что внутри элемента управления UserUploads я хотел бы подключить виртуальную машину в XAML, чтобы помочь в проектировании, например:

<UserControl x:Class=".....UserUploads"
   .....
    DataContext="{Binding Source={StaticResource ViewModelLocater},
                  Path=UserAdministrationViewModel}">

Это свойство вернет VM с живыми службами во время выполнения и VM с макетными данными во время разработки.

Вопрос: будет ли этот XAML вмешиваться в то, что я делаю, связывая содержимое TabItems с экземпляром ViewModel и полагаясь на приведенный выше шаблон данных, чтобы отобразить правильный вид? Если да, есть ли способ заставить обе эти концепции работать вместе?

Ответ 1

Существует более простой способ сделать это. Имейте DesignTimeUserAdministrationViewModel и заполните его статическими данными в конструкторе и обратитесь к этому в UserControl как:

<UserControl d:DataContext="{d:DesignInstance designTimeVMs:DesignTimeUserAdministrationViewModel, IsDesignTimeCreatable=True}">

Таким образом, у вас есть данные теста времени разработки, привязанные к d:DataContext и текущим данным времени выполнения, привязанным к фактическому DataContext. Подробнее здесь.

Ответ 2

Да, я думаю, что это повлияет на вашу текущую настройку

ViewModelLocator - это статический класс, который возвращает объект-заглушку во время разработки и статический ViewModel во время выполнения. Это означает, что

  • ViewModelLocator, а не ваш ParentViewModel, содержит ваши TabViewModels

  • Вы не можете сразу открывать сразу несколько экземпляров одной и той же вкладки (ViewModel)

  • Вы не можете управлять вкладками "Открыть/закрыть", если вы не ссылаетесь на UserControl, что является нарушением принципа MVVM, где ViewModel не знает о представлении

  • Вы не можете создавать новые экземпляры TabViewModel с параметризованными конструкторами. Например, OpenTabs.Add(new CustomerViewModel(CustomerId));

Возможно, альтернативой может быть Конвертер? Тот, который возвращает статический объект, если во время разработки или связанный объект во время выполнения? Я никогда не тестировал такую ​​вещь, но теоретически она должна работать:)

Ответ 3

Встроенный материал MS неплох, но еще одна более элегантная и структурно обоснованная альтернатива, которую я занимаю в своем проекте: http://msdn.microsoft.com/en-us/magazine/dn169081.aspx

В основном, вы используете инструментарий MVVM Light с контейнером SimpleIoc, с которым он поставляется, и в конечном итоге можно обслуживать данные для следующих трех сценариев:

Время разработки, время выполнения и время тестирования.

Еще лучше, весь смысл MVVM Light заключается в том, чтобы ваши материалы были непосредственно редактируемыми в Blend, и есть целая серия видео и блогов и примеры приложений, описывающих все это. Мне жаль, что я не нашел их ранее в моих исследованиях WPF.