2010-11-11 12 views
3

Я пишу небольшое приложение, чтобы изучить WPF/MVVM, и у меня есть своя головоломка, у меня есть объект viewmodel, готовый к работе, но я не знаю, где его указать.Где я могу указать объект моей модели?

Viewmodel представляет собой отдельные данные Windows (некоторые значения ползунков, значение progressbar и несколько текстовых строк. Некоторые из них напрямую привязаны к модели, которая экспонируется, другие находятся в режиме просмотра, чтобы не добавлять новые функции к модели .)

Мне понадобится только один из этих объектов за раз (за окно, но я разрешаю только 1 окно), хотя это действительно не одноэлемент. Он будет существовать в течение всего жизненного цикла окна (это нормально?)

Итак, мой вопрос: должен ли я экземпляр viewmodel как статический ресурс в App.Xaml, как член App.xaml. cs в коде позади (внутри переопределенного метода OnStartup) или как ресурс в Window.xaml или как объект в Window.xaml.cs.

Я видел, как люди использовали его как локальный ресурс и как глобальный объект при запуске, но мне кажется, что он не должен находиться в коде (все, что я делаю, это выбросить его в воздух , как только он окажется в силе, он может позаботиться обо всем остальном. В этом весь смысл, на самом деле).

Итак, мысли о том, где должна отображаться модель обзора?

ответ

4

Это абсолютно нормально, если модель представления окна существует только для жизни своего окна. Создание его может быть столь же просто, как положить:

DataContext = new MainWindowViewModel(); 

в конструкторе для MainWindow. Вот как я это делаю в отсутствие веской причины не делать этого. (Если в окне будет необходимо взаимодействовать с моделью просмотра в обработчиках событий, что она иногда делает, я создам личное поле для объекта, так что мне не нужно оставлять листинг DataContext во всех обработчиках событий.)

Обычно модель представления должна взаимодействовать с одним или несколькими объектами домена. Задача в этом случае заключается в том, чтобы показать модель представления об этом объекте, не связывая объект домена с окном, создающим модель представления. Здесь вы начинаете прикручивать сервисы и локаторы сервисов, а также макетируемые объекты и тому подобное.

Но даже если вы сделаете это, вы можете создать модель представления просто в конструкторе окна, например:

ServiceLocator loc = (ServiceLocator) FindResource("AppServiceLocator"); 
DataContext = new MainWindowViewModel(loc); 

Единственный раз, когда я не создать вид модели окно, в окне-х конструктор - это когда какой-то другой объект - как команда в другом окне - создает окно и устанавливает его DataContext.

0

Я обычно придерживаюсь концепции ViewModelLocator. ViewModelLocator - это StaticResource в App.xaml.

ViewModelLocator использует использует IoC для инъекций зависимых пакетов (Ninject/Unity/...) и можно определить область в DI для Livetime вашей ViewModel ...

Есть также некоторые · блог, · которые работают с MEF и концепцией ViewModelLocator ...