Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 463 / 17 | Длительность: 18:38:00
Специальности: Программист
Лекция 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