ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 27.09.2019
Просмотров: 256
Скачиваний: 1
â 10 РеализаÑÐ¸Ñ MVVM на WPF
Ðадание
1)
РазобÑаÑÑÑÑ Ñ Ð¿ÑимеÑом вÑдаÑи/пÑиема книг в библиоÑеке,
поÑÑÑоенном на оÑнове Ñаблона MVVM (Model-View-ViewModel) (в
папке SampleMVVM). ÐзÑÑиÑÑ Ð°ÑÑ
иÑекÑÑÑÑ Ð¸ пÑинÑип поÑÑÑоениÑ
Ñаблона.
2)
РазÑабоÑаÑÑ Ð¿Ð¾ аналогии пÑиложение WPF, поÑÑÑоенное на оÑнове
MVVM. ÐÐ»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸ÑполÑзоваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
1, 5, 9,
13
Ðанк
Рбанке ÑÑÑеÑÑвÑÑÑ Ð¾Ð¿ÑеделеннÑе ÑÐ¸Ð¿Ñ Ð²ÐºÐ»Ð°Ð´Ð¾Ð² и вкладÑики. Ð
окне вÑполниÑÑ Ð½Ð°Ð²Ð¸Ð³Ð°ÑÐ¸Ñ Ð¿Ð¾ Ñипам вклада Ñ Ð¿ÑоÑмоÑÑом
инÑоÑмаÑии о вкладÑикаÑ
: Ñип вклада, ФÐÐ, даÑа, Ð±Ð°Ð»Ð°Ð½Ñ Ð¸ Ñ.д.
2, 6, 10,
14
ÐУÐ
РвÑзе ÑÑÑеÑÑвÑÐµÑ Ð½Ð°Ð±Ð¾Ñ Ð´Ð¸ÑÑиплин: название, колиÑеÑÑво
лекÑий, колиÑеÑÑво лабоÑаÑоÑнÑÑ
, вид конÑÑолÑ, лекÑоÑ,
колиÑеÑÑво ÑлÑÑаÑелей Ñ.д. ÐÑганизоваÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑÑденÑов на
диÑÑиплинÑ: запиÑÑ/оÑÐ¼ÐµÐ½Ñ Ð½Ð° кÑÑÑ Ð¾Ð¿Ñеделенного лекÑоÑа.
3, 7, 11,
15
Склад
Ðа Ñкладе имееÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð¿ÑодÑкÑиÑ: вид, наименование,
аÑÑикÑл, Ñена, колиÑеÑÑво и Ñ.п. ÐÑганизоваÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ,
Ñдаление и обновление ÑоваÑов на Ñкладе
4, 8, 12,
16
ÐвиакомпаниÑ
У авиакомпании еÑÑÑ Ð¾Ð¿ÑеделеннÑе ÑейÑÑ: номеÑ, Ð´ÐµÐ½Ñ Ð½ÐµÐ´ÐµÐ»Ð¸,
пÑÐ½ÐºÑ Ð½Ð°Ð·Ð½Ð°ÑениÑ, колиÑеÑÑво меÑÑ Ñ.п. ÐÑганизоваÑÑ Ð¿ÑодажÑ
билеÑов (Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑа).
Ðо
желаниÑ
СделайÑе ÑпÑавление (ÑвойÑÑва, ÑазмеÑÑ, колиÑеÑÑво и Ñп.)
игÑовÑми обÑекÑами (пÑиÑÑ, колобки, ÑамолеÑÑ, Ñанки), коÑоÑÑе
менÑÑÑ Ñвое визÑалÑное оÑобÑажение или движение.
ÐопÑоÑÑ
1.
ЧÑо Ñакое MVC, MVP, MVVM?
2.
ÐбÑÑÑниÑе из ÐºÐ°ÐºÐ¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов ÑоÑÑÐ¾Ð¸Ñ Ð¿Ð°ÑÑеÑн MVVM?
3.
Ðаким обÑазом паÑÑеÑн можно ÑеализоваÑÑ Ð² WPF?
4.
ÐбÑÑÑниÑе назнаÑение инÑеÑÑейÑа INotifyPropertyChanged?
5.
ÐаÑем нÑжен инÑеÑÑÐµÐ¹Ñ ICommand и как паÑÑеÑн MVVM иÑполÑзÑеÑ
ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² WPF-пÑиложениÑÑ
.
6.
Чем оÑлиÑаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¾Ñ ÑобÑÑий?
7.
РаÑÑкажиÑе о назнаÑении и об оÑновнÑÑ
возможноÑÑÑÑ
ÑледÑÑÑиÑ
библиоÑек и ÑÑеймвоÑков: Light Toolkit, Catel и Prism.
ТеоÑеÑиÑеÑкие ÑведениÑ:
MVVM â Model â View â ViewModel â паÑÑеÑн оÑганизаÑии PL
(
presentation layer
â ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¿ÑедÑÑавлениÑ).
ÐаÑÑеÑн MVVM пÑименÑеÑÑÑ Ð¿Ñи Ñоздании пÑиложений Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
WPF. ÐÑÐ¾Ñ Ð¿Ð°ÑÑеÑн бÑл пÑидÑман - John Gossman. ÐдеологиÑеÑки MVVM
поÑ
ож на Presentation Model опиÑаннÑй ФаÑлеÑом, но MVVM ÑилÑно
опиÑаеÑÑÑ Ð½Ð° возможноÑÑи WPF.
Шаблон MVVM Ð¸Ð¼ÐµÐµÑ ÑÑи оÑновнÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа:
моделÑ
, коÑоÑаÑ
пÑедÑÑавлÑÐµÑ Ð±Ð¸Ð·Ð½ÐµÑ-Ð»Ð¾Ð³Ð¸ÐºÑ Ð¿ÑиложениÑ,
пÑедÑÑавление
полÑзоваÑелÑÑкого
инÑеÑÑейÑа XAML, и
пÑедÑÑавление-моделÑ
, в коÑоÑом ÑодеÑжиÑÑÑ Ð²ÑÑ
логика поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð³ÑаÑиÑеÑкого инÑеÑÑейÑа и ÑÑÑлка на моделÑ, поÑÑÐ¾Ð¼Ñ Ð¾Ð½
вÑÑÑÑÐ¿Ð°ÐµÑ Ð² каÑеÑÑве модели Ð´Ð»Ñ Ð¿ÑедÑÑавлениÑ
ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¾ÑобенноÑÑÑ MVVM заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо вÑе поведение
вÑноÑиÑÑÑ Ð¸Ð·
пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (view)
в
Ð¼Ð¾Ð´ÐµÐ»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ (view
model)
. СвÑзÑвание пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ модели пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾ÑÑÑеÑÑвлÑеÑÑÑ
деклаÑаÑивнÑми байндингами в XAML ÑазмеÑке. ÐÑо позволÑÐµÑ ÑеÑÑиÑоваÑÑ
вÑе деÑали инÑеÑÑейÑа не иÑполÑзÑÑ ÑложнÑÑ
инÑÑÑÑменÑалÑнÑÑ
ÑÑедÑÑв.
РаÑÑмоÑÑим пÑоекÑ.
ÐÐ»Ñ Ð¿ÑоекÑа, поÑÑÑоенного на оÑнове MVVM ÑоздаеÑÑÑ ÑледÑÑÑÐ°Ñ ÑÑÑÑкÑÑÑа
Ñайлов:
ÐÑÑÑÑ Ð½Ð°Ð´Ð¾ ÑеализоваÑÑ ÑледÑÑÑÑÑ Ð·Ð°Ð´Ð°ÑÑ: оÑобÑажение ÑпиÑка книг
ÑиÑалÑного зала. У книги еÑÑÑ: Ðазвание, ÐвÑоÑ, ÐоÑÑÑпное колиÑеÑÑво
ÐÑÑÑÑ Ñ Ð¾Ð´ÑÑ ÑиÑаÑели беÑÑÑ ÐºÐ½Ð¸Ð³Ð¸ поÑиÑаÑÑ Ð¸Ð»Ð¸ возвÑаÑаÑÑ Ð¸Ñ Ð¾Ð±ÑаÑно.
Ðадо в лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð·Ð½Ð°ÑÑ, ÑколÑко ÑкземплÑÑов Ñой или иной книги оÑÑалоÑÑ
и можем ли Ð¼Ñ ÐµÐµ вÑдаÑÑ. Ðа пÑимеÑе задаÑи ÑаÑÑмоÑÑим MVVM
Model
Model â ÑÑо ÑÑÑноÑÑи ÑиÑÑемÑ. ÐÐ¾Ð´ÐµÐ»Ñ Ð±ÑÐ´ÐµÑ ÑоÑÑоÑÑÑ Ð¸Ð· одного
пÑоÑÑого клаÑÑа:
Book.cs
class
Book
{
public
string
Title {
get
;
set
; }
public
string
Author {
get
;
set
; }
public
int
Count {
get
;
set
; }
public
Book(
string
title,
string
author,
int
count)
{
this
.Title = title;
this
.Author = author;
this
.Count = count;
}
}
ViewModel
ViewModel âпожалÑй, клÑÑевой моменÑ. ÐÑо Ñакие ÑпеÑиалÑнÑе
клаÑÑÑ, коÑоÑÑе:
ï·
ÐÑÑÑеÑÑвлÑÑÑ ÑвÑÐ·Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¼Ð¾Ð´ÐµÐ»ÑÑ Ð¸ ÑоÑмой.
ï·
ÐÑÑлеживаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² даннÑÑ , пÑоизведеннÑе полÑзоваÑелем.
ï·
ÐбÑабаÑÑваÑÑ Ð»Ð¾Ð³Ð¸ÐºÑ ÑабоÑÑ View (Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ команд)
Ð ÑÑеÑом даÑабиндинга в WPF ÑÑо Ð´Ð°ÐµÑ ÑледÑÑÑий ÑезÑлÑÑаÑ: в C#-коде
ÑоÑÐ¼Ñ ÑÑановиÑÑÑ ÑовÑем не надо ниÑего пиÑаÑÑ. ViewModel Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸:
BookViewModel
.cs
class
BookViewModel
:
ViewModelBase
{
public
Book
Book;
public
BookViewModel(
Book
book)
{
this
.Book = book;
}
public
string
Title
{
get
{
return
Book.Title; }
set
{
Book.Title =
value
;
OnPropertyChanged(
"Title"
);
}
}
public
string
Author
{
get
{
return
Book.Author; }
set
{
Book.Author =
value
;
OnPropertyChanged(
"Author"
);
}
}
public
int
Count
{
get
{
return
Book.Count; }
set
{
Book.Count =
value
;
OnPropertyChanged(
"Count"
);
}
}
BookViewModel ÑнаÑледован
оÑ
клаÑÑа ViewModelBase. ViewModelBase,
в
ÑвоÑ
оÑеÑедÑ,
ÑеализÑеÑ
инÑеÑÑÐµÐ¹Ñ INotifyPropertyChanged и ÑодеÑÐ¶Ð¸Ñ ÑÑнкÑÐ¸Ñ OnPropertyChanged.
ÐÑо нÑжно Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð²Ñегда можно бÑло вÑзваÑÑ ÑобÑÑие "изменилоÑÑ
Ñакое-Ñо поле". Ðак видно в коде, пÑи лÑбом изменении Ð¿Ð¾Ð»Ñ Ñакое ÑобÑÑие
вÑзÑваем и пеÑедаем в каÑеÑÑве паÑамеÑÑа его название. ÐоÑом на ÑоÑме
биндинг Ð¼Ð¾Ð¶ÐµÑ ÑÑо ÑобÑÑие обÑабоÑаÑÑ Ð¸, как ÑледÑÑвие, инÑеÑÑÐµÐ¹Ñ Ð¸
ViewModel вÑегда бÑдÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом ÑинÑ
ÑонизиÑованÑ.
Ðомимо BookViewModel еÑÑÑ ÐµÑе клаÑÑ MainViewModel, ÑвÑзаннÑй Ñ
ÑоÑмой. Ðобавим в него поле:
public
ObservableCollection
<
BookViewModel
> BooksList {
get
;
set
; }
ObservableCollection â ÑÑо ÑпеÑиалÑÐ½Ð°Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑиÑ, коÑоÑÐ°Ñ ÑмееÑ
оÑÑлеживаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñебе. Также изменим конÑÑÑÑкÑоÑ:
public
MainViewModel(
List
<
Book
> books)
{
BooksList =
new
ObservableCollection
<
BookViewModel
>(books.Select(b =>
new
BookViewModel
(b)));
}
View
ÐÑо окно, либо User Control. У лÑбого FrameworkElement-а WPF еÑÑÑ
Ñакое поле DataContext. DataContext Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑбÑм object-ом, имеÑÑ ÐºÐ°ÐºÐ¸Ðµ
Ñгодно полÑ, а его Ð³Ð»Ð°Ð²Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñа â ÑвлÑÑÑÑÑ Ð¸ÑÑоÑником даннÑÑ
длÑ
Databinding-а. ФоÑма вÑего одна, DataContext Ð´Ð»Ñ Ð½ÐµÐµ заполнÑеÑÑÑ Ð²
меÑоде OnStartup, ÑÑо в App.xaml.cs. ÐодиÑиÑиÑÑем и полÑÑиÑÑÑ ÑледÑÑÑее:
App.xaml.cs
public
partial
class
App
:
Application
{
private
void
OnStartup(
object
sender,
StartupEventArgs
e)
{
List
<
Book
> books =
new
List
<
Book
>()
{
new
Book
(
"ÐÑÑеÑÐ½Ñ Ð¿ÑоеÑиÑованиÑ"
,
"John Gossman"
, 3),
new
Book
(
"CLR via C#"
,
"ÐжеÑÑÑи Ð Ð¸Ñ ÑеÑ"
, 2),
new
Book
(
"ÐÑÑкÑÑÑво пÑогÑаммиÑованиÑ"
,
"ÐнÑÑ"
, 2)
};
MainView
view =
new
MainView
();
// Ñоздали View
MainViewModel
viewModel =
new
ViewModels.
MainViewModel
(books);
// Создали
ViewModel
view.DataContext = viewModel;
// положили ViewModel во View в каÑеÑÑве
DataContext
view.Show();
}
}
ÐÑÑалоÑÑ Ð½Ð°Ð¿Ð¸ÑаÑÑ XAML-код ÑоÑмÑ:
MainView.xaml
<
ListView
ItemsSource
="{
Binding
BooksList
}"
IsSynchronizedWithCurrentItem
="True">
<
ListView.ItemTemplate
>
<
DataTemplate
>
<
Border
BorderBrush
="Bisque"
BorderThickness
="1"
Margin
="10">
<
StackPanel
Margin
="10">
<
TextBlock
Text
="{
Binding
Title
}"
FontWeight
="Bold"/>
<
TextBlock
Text
="{
Binding
Author
}" />
<
StackPanel
Orientation
="Horizontal">
<
TextBlock
Text
="ÐÑÑалоÑÑ:" />