Где я могу создать экземпляр моего объекта модели представления? - PullRequest
3 голосов
/ 11 ноября 2010

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 12 ноября 2010

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

DataContext = new MainWindowViewModel();

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

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

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

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

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

0 голосов
/ 12 ноября 2010

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

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

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

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