Використання патерну MVVM

Така потужна модель звязування даних дозволяє використовувати патерн

MVVM для архітектури додатку

Даний патерн був представлений Джоном Госсманом в 2005 році Він являє модифікацію патерну MVP і орієнтований на сучасні платформи розробки, які мають можливість звязування даних Завдяки застосуванню цього патерну у нас зявляється можливість поділу уявлення і моделі, тим самим ми можемо змінювати їх незалежно один від одного Наприклад, розробники створюють логіку роботи програми, а дизайнери працюють над інтерфейсом програми

Цей патерн слід застосовувати, якщо в технології присутній механізм скріплення даних Використання паттерна MVC / MVP в таких випадках не вкладається в їх концепцію

Патерн MVVM ділиться на три частини (Мал 53):

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Model  – Представляє фундаментальні дані, необхідні для роботи програми

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp View – Це графічний інтерфейс нашого застосування

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp ViewModel – Є з одного боку абстракцією View, а з іншого – надає обгортку даних з Model, які підлягають скріпленню Тобто вона містить Model, яка перетворена до View, а так само містить команди, якими може користуватися View, щоб впливати на Model

Рис 53

Класична реалізація базової 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 (зверніть увагу, що створювати ViewModel за принципом для кожної Model своя ViewModel – неправильно)

public class EmployeeViewModel : ViewModel

{

public ObservableCollection&ltEmployee&gt 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&ltEmployee&gt

{

new Employee { FirstName=&quotSergii&quot, LastName=&quotLutai&quot, Age=27, EMail=&quotsergiilutai@dctua&quot},

new Employee { FirstName=&quotSergiy&quot, LastName=&quotBaydachnyy&quot, Age=32, EMail=&quotSergiyBaydachnyy@microsoftcom&quot},

new Employee { FirstName=&quotIvan&quot, LastName=&quotIvanov&quot, Age=29, EMail=&quotivan@ivanovua&quot}

}

AddEmployee = new RelayCommand&ltEmployee&gt (thisAddEmployeeExecute, thisAddEmployeeCanExecute)

}

private void AddEmployeeExecute(Employee employee)

{

/ / TODO: Логіка додавання обєкта

}

private bool AddEmployeeCanExecute(Employee employee)

{

/ / TODO: Логіка перевірки можливості додавання нового обєкта

return employee = null

}

}

У даному прикладі клас RelayCommand є однією з можливих реалізацій інтерфейсу SystemWindowsInputRelayCommand:

public class RelayCommand&ltT&gt: ICommand

{

private Action&ltT&gt action private Func&ltT, bool&gt func

public RelayCommand(Action&ltT&gt action)

{

thisaction = action

}

public RelayCommand(Action&ltT&gt action, Func&ltT, bool&gt func)

{

thisaction = action thisfunc = func

}

public bool CanExecute(object parameter)

{

bool result = true

T value = default(T)

if (parameter = null &amp&amp (parameter is T))

{

«parameter&quot)

}

throw new ArgumentException(«Wrong parameter type&quot,

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 &amp&amp (parameter is T))

{

«parameter&quot)

}

throw new ArgumentException(«Wrong parameter type&quot,

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, EventArgsEmpty)

}

}

}

Для перевірки нашої логіки будемо використовувати наступне уявлення:

&ltPage x:Class=&quotMVVMSampleBlankPage&quot xmlns=&quothttp://schemasmicrosoftcom/winfx/2006/xaml/presentation&quot xmlns:x=&quothttp://schemasmicrosoftcom/winfx/2006/xaml&quot xmlns:local=&quotusing:MVVMSample&quot xmlns:viewModel=&quotusing:ViewModel&quot&gt

&ltPageResources&gt

&ltviewModel:EmployeeViewModel x:Key=&quotEmployeeViewModel&quot/&gt

&lt/PageResources&gt

&ltPageDataContext&gt

&ltBinding Source=&quot{StaticResource EmployeeViewModel}&quot/&gt

&lt/PageDataContext&gt

&ltGrid Background=&quot{StaticResource ApplicationPageBackgroundBrush}&quot&gt

&ltButton Content=&quotAdd New Employee&quot VerticalAlignment=&quotTop&quot Command=&quot{Binding AddEmployee, Mode=OneTime,

Source={StaticResource EmployeeViewModel}}&quot/&gt

&ltListBox ItemsSource=&quot{Binding EmployeeCollection}&quot Margin=&quot0,40,0,0&quot&gt

&ltListBoxItemTemplate&gt

&ltDataTemplate&gt

&ltStackPanel Orientation=&quotHorizontal&quot&gt

&ltButton Content=&quotDelete&quot Command=&quot{Binding DeleteEmplyee, Mode=OneWay, Source={StaticResource EmployeeViewModel}}&quot CommandParameter=&quot{Binding Mode=OneWay}&quot/&gt

&ltButton Content=&quotEdit&quot Command=&quot{Binding EditEmployee, Mode=OneWay, Source={StaticResource EmployeeViewModel}}&quot CommandParameter=&quot{Binding Mode=OneWay}&quot/&gt

&ltTextBlock Text=&quot{Binding FirstName}&quot

Margin=&quot40,0,40,0&quot/&gt

&ltTextBlock Text=&quot{Binding LastName}&quot/&gt

&lt/StackPanel&gt

&lt/DataTemplate&gt

&lt/ListBoxItemTemplate&gt

&lt/ListBox&gt

&lt/Grid&gt

&lt/Page&gt

Під час роботи наш приклад має наступний вигляд:

Рис 54

Рис 55

Таким чином, використовуючи патерн MVVM, ми можемо розділити роботу дизайнерів і розробників Що в свою чергу дозволяє зосередитися саме на логіці бізнес-процесів всередині програми При цьому можливість тестування бізнес-логіки додатка збільшується в рази Можливість тестування буде розглянута в розділі 12

Сергій Лутай, Сергій Байдачний, Windows 8 для C # розробників

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*