2012-06-21 2 views
2

Я пишу свое первое приложение WPF с использованием MVVM, и я запутался в роли View Model и где должен поместить код, который должен запускаться при запуске приложения.Где должна запускаться логика запуска в MVVM?

Мое приложение очень простое. В нем перечислены файлы из удаленного места, которые пользователь может выбрать для копирования на свой компьютер. Когда приложение сначала запускается, он должен определить текущий источник файлов из файла конфигурации, прочитать текущие файлы в источнике и перечислить их пользователю в главном окне. Если сконфигурированный источник файла не найден, пользователю будет предложено выбрать источник.

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

Если это было приложение WinForms, я бы сделал это в событии Form.Load или Form.Shown.

ответ

3

Обычно основной код загрузки данных может храниться в отдельной функции viewmodel, такой как ViewModel.Initialize() ... что более важно на фоне потока coz, который не повесит GUI во время его выполнения, и до этого момента вы можете показать занятого официанта нацеленность на графический интерфейс.

Вы можете сделать это Command приводом для Вашего удобства (например, реле/​​DelegateCommand, таких как InitilizeCommand) и Initialize() метод может быть Execute делегатом команды.

Initialize() можно назвать на основе вашего удобства ... начать в в конструкторе ViewModel, либо обрабатывать событие Window/UserControl.Load, используя прилагаемую поведение и график функции «ViewModel.Initialize()», до тех пор, как функция на другой фоновой теме, мы хороши.

Если вы используете шаблоны и методы работы PRISM, то загрузка данных, подобная этому, может быть автоматически вставлена ​​в определенные модули как часть всего этого проекта композитного графического интерфейса, который представляет собой Prism.

Хороший учебник MVVM здесь ... http://msdn.microsoft.com/en-us/library/gg405484%28v=pandp.40%29.aspx

3

Если у вас есть простое приложение, и запуск, как известно, не является длительным, вы можете загружать ваше приложение, используя единство.

Все на том, что показано в действительно хорошее введение видео для MVVM доступны здесь: Jason Dollinger on MVVM

исходный код, он развивается в этом видео также доступна: Source code of the model-view-viewmodel video

Кроме того, ваш bootstraping логика (конфигурация чтения, ...) должна явно управляться с помощью модели. У вас все еще может быть ConfigSource, , который выполняет чтение и может быть запущен в фоновом потоке.

Реализация этого источника может иметь интерфейс, который позволяет легко обменивать ваш ConfigSource на тот, который считывает данные из базы данных или в другом месте. И: вы можете получить такой экземпляр от единиц, отделяя больше от конкретной реализации.Вы можете использовать инъекции конструкторы с таким:

т.е. ViewModel загрузились => получает ConfigReader впрыскивается => вызова ConfigReader (на BackgroundThread) => Просмотр наполняется

0

Это хорошая практика, чтобы не делать комплекс логики в ctor. Как уже было сказано, лучше определить метод Initialize() (даже лучше, если он будет членом интерфейса IInitializable).

Если ваше приложение действительно прост и не планируется его удлинить, вы можете комбинировать Model и ViewModel слоями и делать всю работу прямо в ViewModel. Но если ваше приложение достаточно сложно, классы Model должны быть введены через конструктор в ViewModel. Классы Model содержат всю логику, а ViewModel использует их для выполнения действий и отображения данных.

Смежные вопросы