Использование шаблона проектирования MVVM
В Листинге 23.9 вы можете видеть код файла MainPage.xaml.cs
using System; using System.Linq; using System.Windows; using Microsoft.Phone.Controls; using sdkMVVMCS.ViewModelNS; namespace sdkMVVMCS { public partial class MainPage : PhoneApplicationPage { private ViewModel vm; // Конструктор public MainPage() { InitializeComponent(); vm = new ViewModel(); } // При переходе на страниу protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); if (!StateUtilities.IsLaunching && this.State.ContainsKey("Accomplishments")) { // Старый экземпляр приложения // Пользователь запустил приложение, перейдя к нему по нажатию кнопки Назад. vm = (ViewModel)this.State["Accomplishments"]; MessageBox.Show("Получаем сведения из данных состония страницы"); } else { // Новый экземпля приложения // Пользователь запустил приложение из списка, // либо нет сохраненного состояния страницы. vm.GetAccomplishments(); MessageBox.Show("Получаем данные не из состояния страницы, а либо загружаем из хранилища, либо - используем данные по умолчанию"); } // У нас имеется два разных представления (views), но лишь одна модель прдставления (view model.) // Поэтому используем LINQ-запросы для выборки данных, необходимых каждому из представлений. // Задаём контекст данных для представления, которое служит для вывода сведенийи о собранных элементах (Item). ItemViewOnPage.DataContext = from Accomplishment in vm.Accomplishments where Accomplishment.Type == "Item" select Accomplishment; // Задаём контекст данных для представления, которое служит для вывода сведений об уровнях (Level). LevelViewOnPage.DataContext = from Accomplishment in vm.Accomplishments where Accomplishment.Type == "Level" select Accomplishment; // Если используется лишь одно представление, его можно заполнить так, как показано ниже //AccomplishmentViewOnPage.DataContext = vm.Accomplishments; } // При уходее со страницы protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); //Если в словаре State страницы уже имется ключ с таким именем if (this.State.ContainsKey("Accomplishments")) { //Запишем в него данные this.State["Accomplishments"] = vm; } else { //Если такого ключа нет - создадим его и запишем данные this.State.Add("Accomplishments", vm); } StateUtilities.IsLaunching = false; } //Щелчок по кнопке панели приложения для сохранения данных private void AppBarSave_Click(object sender, EventArgs e) { //Вызов метода модели представления для сохранения данных vm.SaveAccomplishments(); } } }Листинг 23.9. Код файла MainPage.xaml.cs
Основное назначение этого кода – задать в качестве контекста данных представлений соответствующую модель представления. Здесь имеется переменная vm, которая представляет собой объект класса ViewModel. Так как модель представления одна, а представлений – два, здесь используются LINQ-запросы для выбора нужных данных из модели представления для каждого из представлений.
Кроме того, здесь реализован механизм временного хранения данных в словаре State, который используется для хранения данных, связанных со страницей. Если приложение уже было запущено и пользователь возвращается к нему, активируя (для того, чтобы узнать о состоянии приложения и используется вышерассмотренный класс StateUtilities), делается попытка получить данные из словаря и инициализировать ими модель представления. Если получить данные из словаря не удалось, либо приложение было запущено, например, из списка или с Рабочего стола, выполняется инициализация модели представления её собственными средствами (загрузка значений по умолчанию или загрузка данных из хранилища, если ранее данные были сохранены).
Запись в словарь State делается при уходе со страницы.
По нажатию на кнопку сохранения данных на панели приложения вызывается соответствующий метод модели представления.
Выводы
В этой лабораторной работе мы подробно рассмотрели пример реализации приложения, использующего шаблон MVVM. Рекомендуется несколько раз проработать пример, приведенный здесь для того, чтобы лучше понять работу механизмов приложения, построенного по шаблону MVVM.
Если ранее вы не были знакомы с этим шаблоном, использование громоздких, на первый взгляд, механизмов может показаться неоправданно усложняющим структуру приложения. Однако, такое впечатление обманчиво, и возникает оно обычно только тогда, когда речь идёт о сравнении реализации простых небольших проектов с использованием MVVM и без использования. Когда сложность проекта вырастает, когда над проектом работает несколько разработчиков (или разработчик и дизайнер), применение MVVM, за счёт разделения пользовательского интерфейса и данных, позволяет сохранить структуру проекта чёткой и понятной, упростить совместную работу.
Задание
Для дальнейшего освоения использования шаблона MVVM в разработке приложений для Windows Phone, рекомендуется самостоятельно ознакомиться со следующими примерами:
- "Windows Phone Starter Kit for RSS - WP8" ("Стартовый проект для разработки RSS-приложений для Windows Phone 8", http://code.msdn.microsoft.com/Windows-Phone-Starter-Kit-390ee0ef
- "Sharing Code between Windows Store and Windows Phone App (PCL + MVVM + OData)" ("Совместное использование кода в приложениях для Магазина Windows и для Windows Phone (PCL + MVVM + OData)"), http://code.msdn.microsoft.com/Sharing-Code-between-411c999b
Здесь, для разработки демонстрационных приложений, использован набор инструментов MVVM Light Toolkit. Дополнительные материалы по этому набору инструментов можно найти по следующим адресам: http://www.galasoft.ch/mvvm/, http://mvvmlight.codeplex.com/, http://channel9.msdn.com/ (здесь можно найти множество видеоматериалов, в частности, по MVVM Light).
Дополнительные материалы
К данной лабораторной работе подготовлено видеоприложение.