Опубликован: 22.12.2012 | Уровень: для всех | Доступ: платный
Лекция 9:

Проектирование информационной системы для Windows Store. Обработка данных

< Лекция 8 || Лекция 9: 123 || Лекция 10 >

Использование паттерна MVVM

Модель связывания данных в WinRT позволяет использовать паттерн MVVM для архитектуры приложения. Данный паттерн был представлен Джоном Госсманом в 2005 году. Он представляет модификацию паттерна MVP и ориентирован на современные платформы разработки, которые имеют возможность связывания данных.

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

Данный паттерн следует применять, если в технологии присутствует механизм связывания данных. Использование паттерна MVC/MVP в таких случаях не вкладывается в их концепцию.

Паттерн MVVM делится на три части (Рис. 8.3):

  • Model - представляет фундаментальные данные, необходимые для работы приложения;
  • View - это графический интерфейс нашего приложения;
  • ViewModel - является с одной стороны абстракцией View, а с другой - предоставляет обертку данных из Model, которые подлежат связыванию. То есть она содержит Model, которая преобразована к View, а так же содержит команды, которыми может пользоваться View, чтобы влиять на Model.

Рис. 8.3.

Классическая реализация базовой ViewModel:

public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}

Далее, разделение логики на модели ViewModel происходит отдельно для каждого проекта. Все последующие ViewModel являются наследниками базовой.

Например, возьмем тип данных Employee и реализуем для него ViewModel

public class EmployeeViewModel : ViewModel
{
public ObservableCollection<Employee>
EmployeeCollection { get; private set; }
public ICommand AddEmployee { get; private set; }
public ICommand EditEmployee { get; private set; }
public ICommand DeleteEmplyee { get; private set; }
public EmployeeViewModel()
{
EmployeeCollection = new ObservableCollection<Employee>
{
new Employee { FirstName="Sergii", LastName="Lutai",
Age=27, EMail="sergii.lutai@dct.ua"},
new Employee { FirstName="Sergiy", LastName="Baydachnyy",
Age=32, EMail="Sergiy.Baydachnyy@microsoft.com"},
new Employee { FirstName="Ivan", LastName="Ivanov",
Age=29, EMail="ivan@ivanov.ua"}
};
AddEmployee = new RelayCommand<Employee>
(this.AddEmployeeExecute, this.AddEmployeeCanExecute);
}
private void AddEmployeeExecute(Employee employee)
{
//TODO: Логика добавления объекта
}
private bool AddEmployeeCanExecute(Employee employee)
{
//TODO: Логика проверки возможности добавления нового объекта
return employee != null;
}
}

В данном примере класс RelayCommand является одной из возможных реализаций интерфейса System.Windows.Input.RelayCommand:

public class RelayCommand<T>: ICommand
{
private Action<T> action;
private Func<T, bool> func;
public RelayCommand(Action<T> action)
{
this.action = action;
}
public RelayCommand(Action<T> action, Func<T, bool> func)
{
this.action = action;
this.func = func;
}
public bool CanExecute(object parameter)
{
bool result = true;
T value = default(T);
if (parameter != null && !(parameter is T))
{
throw new ArgumentException("Wrong parameter type.",
"parameter");
}
if (parameter != null)
{
value = (T)parameter;
}
if (func != null)
{
result = func(value);
}
return result;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
T value = default(T);
if (parameter != null && !(parameter is T))
{
throw new ArgumentException("Wrong parameter type.",
"parameter");
}
if (parameter != null)
{
value = (T)parameter;
}
var canExecute = CanExecute(value);
if (canExecute)
{
action(value);
}
}
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}

Для проверки нашей логики будем использовать следующее представление:

<Page
x:Class="MVVM.Sample.BlankPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MVVM.Sample"
xmlns:viewModel="using:ViewModel">
<Page.Resources>
<viewModel:EmployeeViewModel x:Key="EmployeeViewModel"/>
</Page.Resources>
<Page.DataContext>
<Binding Source="{StaticResource EmployeeViewModel}"/>
</Page.DataContext>
<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
<Button Content="Add New Employee" VerticalAlignment="Top"
Command="{Binding AddEmployee, Mode=OneTime,
Source={StaticResource EmployeeViewModel}}"/>
<ListBox ItemsSource="{Binding EmployeeCollection}"
Margin="0,40,0,0">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="Delete"
Command="{Binding DeleteEmplyee, Mode=OneWay,
Source={StaticResource EmployeeViewModel}}"
CommandParameter="{Binding Mode=OneWay}"/>
<Button Content="Edit"
Command="{Binding EditEmployee, Mode=OneWay,
Source={StaticResource EmployeeViewModel}}"
CommandParameter="{Binding Mode=OneWay}"/>
<TextBlock Text="{Binding FirstName}"
Margin="40,0,40,0"/>
<TextBlock Text="{Binding LastName}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Page>

Во время работы наш пример имеет следующий вид:


Рис. 8.4.

Таким образом, используя паттерн MVVM, можно разделить работу дизайнеров и разработчиков. Что в свою очередь позволяет сосредоточиться именно на логике бизнес-процессов внутри приложения. При этом возможность тестирования бизнес-логики приложения увеличивается в разы.

Краткие итоги

Рассмотрены основные подходы к проектированию информационных систем. Отмечены основные отличия информационных систем от локальных программных продуктов.

Вопросы

  1. Какие ключевые вопросы необходимо решить при оценке проектов?
  2. Что включает информационная архитектура?
  3. Стадии и этапы создания информационных систем и технологий с позиции руководства организации.
  4. Что собой представляет жизненный цикл информационных систем?
  5. Каковы стадии жизненного цикла информационных систем?
  6. Этапы предпроектного обследования информационных систем.
  7. Какие этапы включает проектирование информационных систем?
  8. Какие этапы включает стадия разработки информационных систем?
  9. Какие этапы включает стадия ввода информационных систем в эксплуатацию?
  10. Какие этапы включает стадия эксплуатации информационных систем?
  11. Каковы особенности проектирования информационных систем?
< Лекция 8 || Лекция 9: 123 || Лекция 10 >
Екатерина Егорова
Екатерина Егорова
Россия, Красноярск, СФУ, 2008
Даниил Поволоцкий
Даниил Поволоцкий
Беларусь, Минск