ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 27.09.2019
Просмотров: 257
Скачиваний: 1
<
TextBlock
Text
="{
Binding
Count
,
Mode
=TwoWay}"
FontWeight
="Bold"
Margin
="10,0"/>
<
TextBlock
Text
="ÑÑ" />
</
StackPanel
>
</
StackPanel
>
</
Border
>
</
DataTemplate
>
</
ListView.ItemTemplate
>
</
ListView
>
ÐбÑаÑиÑе внимание на конÑÑÑÑкÑÐ¸Ñ Binding в ÑазмеÑке ÑоÑмÑ. Таким
обÑазом можно пÑивÑзÑваÑÑ Ð¿Ð¾Ð»Ñ Ð¾Ð±ÑекÑа, наÑ
одÑÑегоÑÑ Ð² DataContext-е, к
аÑÑибÑÑам конÑÑолов.
РедакÑиÑование
ÐÐ»Ñ Ð²Ñделенной в ÑпиÑке книги бÑÐ´ÐµÑ Ð¾ÑкÑÑваÑÑÑÑ ÑедакÑоÑ. Ðзменим
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
="ÐÑÑалоÑÑ:" />
<
TextBlock
Text
="{
Binding
Count
,
Mode
=TwoWay}"
FontWeight
="Bold"
Margin
="10,0"/>
<
TextBlock
Text
="ÑÑ" />
</
StackPanel
>
</
StackPanel
>
</
Border
>
</
DataTemplate
>
</
ListView.ItemTemplate
>
</
ListView
>
<
ContentControl
Grid.Column
="1"
Content
="{
Binding
BooksList
}">
<
ContentControl.ContentTemplate
>
<
DataTemplate
>
<
Border
BorderBrush
="Bisque"
BorderThickness
="1"
Margin
="10">
<
StackPanel
Margin
="10">
<
TextBlock
Text
="Ðазвание:" />
<
TextBox
Text
="{
Binding
Title
,
UpdateSourceTrigger
=PropertyChanged}"
Margin
="0,0,0,10"/>
<
TextBlock
Text
="ÐвÑоÑ:"/>
<
TextBox
Text
="{
Binding
Author
,
UpdateSourceTrigger
=PropertyChanged}"
Margin
="0,0,0,10"/>
<
StackPanel
Orientation
="Horizontal">
<
Button
Content
="ÐÑдаÑÑ"
Command
="{
Binding
GiveItemCommand
}"
Margin
="10,0" />
<
Button
Content
="ÐабÑаÑÑ"
Command
="{
Binding
GetItemCommand
}"
Margin
="10,0" />
</
StackPanel
>
</
StackPanel
>
</
Border
>
</
DataTemplate
>
</
ContentControl.ContentTemplate
>
</
ContentControl
>
UpdateSourceTrigger=PropertyChanged в ÑÑÑоке биндинга. ÐÑо знаÑиÑ,
ÑÑо лÑбое изменение, пÑоизводимое в данном поле, бÑÐ´ÐµÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾
оÑÑажаÑÑÑÑ Ð½Ð° иÑÑоÑнике:
ÐÑли ÑÑого не напиÑаÑÑ, иÑÑоÑник бÑÐ´ÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑÑÑ ÑолÑко по
оконÑании ÑедакÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (Ñ.е. когда конÑÑол бÑÐ´ÐµÑ ÑеÑÑÑÑ ÑокÑÑ). ÐÑо можеÑ
пÑивеÑÑи к ÑледÑÑÑей оÑибке инÑеÑÑейÑа: когда нажимаеÑÑ "СоÑ
ÑаниÑÑ",
ÑоÑ
ÑанÑеÑÑÑ Ð²Ñе, кÑоме ÑолÑко ÑÑо измененного полÑ.
ÐомандÑ
ÐÑÑÑÑ Ð½ÐµÐºÐ¸Ðµ ÑиÑаÑели беÑÑÑ ÐºÐ½Ð¸Ð³Ð¸ и возвÑаÑаÑÑ. СооÑвеÑÑÑвенно,
Ñделаем две кнопки â «ÐÑдаÑÑ» и «ÐабÑаÑÑ», менÑÑÑие колиÑеÑÑво
имеÑÑиÑ
ÑÑ Ð² налиÑии книг. ÐÑли книг не оÑÑалоÑÑ (Count = 0), кнопка
«ÐÑдаÑÑ» должна бÑÑÑ Ð½ÐµÐ°ÐºÑивной.
Ð MVVM не пиÑÑÑÑÑ Ð¾Ð±ÑабоÑÑики ÑобÑÑий. ФÑнкÑии, коÑоÑÑе нÑжно
вÑполнÑÑÑ ÐºÐ¾Ð½ÑÑолам, пиÑÑÑÑÑ Ð²Ð¾ ViewModel и биндÑÑÑÑ Ðº конÑÑолам ÑоÑно
Ñак же, как полÑ. ТолÑко иÑполÑзÑеÑÑÑ Ð¼ÐµÑ
анизм команд.
Ðоманда должна пÑедÑÑавлÑÑÑ Ð¸Ð· ÑÐµÐ±Ñ ÑкземплÑÑ ÐºÐ»Ð°ÑÑа, ÑеализÑÑÑего
инÑеÑÑÐµÐ¹Ñ ICommand. DelegateCommand â иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑеализаÑии
ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð±ÐµÐ· паÑамеÑÑов и DelegateCommand<T> â Ð´Ð»Ñ ÑеализаÑии командÑ
Ñ Ð¿Ð°ÑамеÑÑом Ñипа T.
ÐаÑамеÑÑÑ Ð¿ÐµÑедаваÑÑ Ð½Ðµ бÑдем. Ðод ViewModel:
BookViewModel.cs
#region
Commands
#region
ÐабÑаÑÑ
private
DelegateCommand
getItemCommand;
public
ICommand
GetItemCommand
{
get
{
if
(getItemCommand ==
null
)
{
getItemCommand =
new
DelegateCommand
(GetItem);
}
return
getItemCommand;
}
}
private
void
GetItem()
{
Count++;
}
#endregion
#region
ÐÑдаÑÑ
private
DelegateCommand
giveItemCommand;
public
ICommand
GiveItemCommand
{
get
{
if
(giveItemCommand ==
null
)
{
giveItemCommand =
new
DelegateCommand
(GiveItem, CanGiveItem);
}
return
giveItemCommand;
}
}
private
void
GiveItem()
{
Count--;
}
private
bool
CanGiveItem()
{
return
Count > 0;
}
#endregion
#endregion
}
Ðод добавлÑеÑÑÑ Ð² BookViewModel, а не в MainViewMode. ÐÑдем
добавлÑÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ в ContentControl, DataContext-ом коÑоÑого ÑвлÑеÑÑÑ
именно BookViewModel.
С пеÑвой командой - Ñоздали командÑ, и в назнаÑили ей в каÑеÑÑве
дейÑÑÐ²Ð¸Ñ Ð¼ÐµÑод GetItem, коÑоÑÑй и бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿Ñи ее акÑиваÑии. Со
вÑоÑой немного инÑеÑеÑнее, но Ñоже пÑоÑÑо. Ðомимо Ñого, ÑÑо она вÑполнÑеÑ
некоÑоÑое дейÑÑвие, она еÑе и Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑовеÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
меÑода CanGiveItem(), Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð½Ð° вÑполнÑÑÑÑÑ Ð¸Ð»Ð¸ неÑ.
Ð XAML-ÑазмеÑÐºÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð¼ ÑледÑÑÑее
MainView.xaml
<
ContentControl
Grid.Column
="1"
Content
="{
Binding
BooksList
}">
<
ContentControl.ContentTemplate
>
<
DataTemplate
>
<
Border
BorderBrush
="Bisque"
BorderThickness
="1"
Margin
="10">
<
StackPanel
Margin
="10">
<
TextBlock
Text
="Ðазвание:" />
<
TextBox
Text
="{
Binding
Title
,
UpdateSourceTrigger
=PropertyChanged}"
Margin
="0,0,0,10"/>
<
TextBlock
Text
="ÐвÑоÑ:"/>
<
TextBox
Text
="{
Binding
Author
,
UpdateSourceTrigger
=PropertyChanged}"
Margin
="0,0,0,10"/>
<
StackPanel
Orientation
="Horizontal">
<
Button
Content
="ÐÑдаÑÑ"
Command
="{
Binding
GiveItemCommand
}"
Margin
="10,0" />
<
Button
Content
="ÐабÑаÑÑ"
Command
="{
Binding
GetItemCommand
}"
Margin
="10,0" />
</
StackPanel
>
</
StackPanel
>
</
Border
>
</
DataTemplate
>
</
ContentControl.ContentTemplate
>
</
ContentControl
>
ÐÑ Ð¿Ð¾Ð»ÑÑили ÑÑебÑемÑÑ ÑÑнкÑионалÑноÑÑÑ. ÐолиÑеÑÑво ÑкземплÑÑов
книги ÑвелиÑиваеÑÑÑ Ð¸ ÑменÑÑаеÑÑÑ, а когда иÑ
ÑÑановиÑÑÑ 0, кнопка «ÐÑдаÑÑ»
дизаблиÑÑÑ (благодаÑÑ ÑпомÑнÑÑÐ¾Ð¼Ñ CanGiveItem).