Вопрос об управлении ViewModel (DesignTime Vs Run Time) - PullRequest
8 голосов
/ 14 июля 2011

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

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

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

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

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

Это свойство будет возвращать ViewModel с работающими сервисами во время выполнения и ViewModel с макетомданные во время разработки.

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

Ответы [ 3 ]

23 голосов
/ 14 июля 2011

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

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

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

1 голос
/ 15 апреля 2014

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

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

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

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

1 голос
/ 14 июля 2011

Да, я думаю, это будет мешать вашей текущей настройке

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...