Вопрос о 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.