Опубликован: 02.08.2013 | Уровень: для всех | Доступ: платный
Лекция 15:
Основы MVVM
using System; using System.Diagnostics; using System.Resources; using System.Windows; using System.Windows.Markup; using System.Windows.Navigation; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using L5_1.Resources; using L5_1.ViewModels; namespace L5_1 { public partial class App : Application { private static MainViewModel viewModel = null; /// <summary> /// Статический элемент ViewModel, используемый в представлениях для привязки. /// </summary> /// <returns>Объект MainViewModel.</returns> public static MainViewModel ViewModel { get { // Отложить создание модели представления до необходимости if (viewModel == null) viewModel = new MainViewModel(); return viewModel; } }Листинг 21.5. Фрагмент файла App.xaml.cs
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using L5_1.Resources; namespace L5_1 { public partial class DetailsPage : PhoneApplicationPage { // Конструктор public DetailsPage() { InitializeComponent(); } // При переходе на страницу установите для контекста данных выбранный элемент в списке protected override void OnNavigatedTo(NavigationEventArgs e) { if (DataContext == null) { string selectedIndex = ""; if (NavigationContext.QueryString.TryGetValue("selectedItem", out selectedIndex)) { int index = int.Parse(selectedIndex); DataContext = App.ViewModel.Items[index]; } } } } }Листинг 21.6. Фрагмент файла DetailPage.xaml.cs
Если говорить о классе ItemViewModel (Листинг 21.7), то он не связан с представлениями, он реализует интерфейс INotifyPropertyChanged, событие PropertyChanged вызывается при изменении свойств, которые описаны в классе.
using System; using System.ComponentModel; using System.Diagnostics; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; namespace L5_1.ViewModels { public class ItemViewModel : INotifyPropertyChanged { private string _id; /// <summary> /// Пример свойства ViewModel; это свойство используется для идентификации объекта. /// </summary> /// <returns></returns> public string ID { get { return _id; } set { if (value != _id) { _id = value; NotifyPropertyChanged("ID"); } } } private string _lineOne; /// <summary> /// Пример свойства ViewModel; это свойство используется в представлении для отображения его значения с помощью привязки. /// </summary> /// <returns></returns> public string LineOne { get { return _lineOne; } set { if (value != _lineOne) { _lineOne = value; NotifyPropertyChanged("LineOne"); } } } private string _lineTwo; /// <summary> /// Пример свойства ViewModel; это свойство используется в представлении для отображения его значения с помощью привязки. /// </summary> /// <returns></returns> public string LineTwo { get { return _lineTwo; } set { if (value != _lineTwo) { _lineTwo = value; NotifyPropertyChanged("LineTwo"); } } } private string _lineThree; /// <summary> /// Пример свойства ViewModel; это свойство используется в представлении для отображения его значения с помощью привязки. /// </summary> /// <returns></returns> public string LineThree { get { return _lineThree; } set { if (value != _lineThree) { _lineThree = value; NotifyPropertyChanged("LineThree"); } } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(String propertyName) { PropertyChangedEventHandler handler = PropertyChanged; if (null != handler) { handler(this, new PropertyChangedEventArgs(propertyName)); } } } }Листинг 21.7. Файл ItemViewModel.cs