EP 16: The MenuItem of ListView binds Command in ViewModel - Way 1

Hello, 各位 iT邦帮忙 的粉丝们大家好~~~

本篇是 Re: 从零开始用 Xamarin 技术来复刻过去开发的一个 App: TopStore 系列文的 EP16。

在本系列的 EP14 当中已经能让使用者在 PeoplePage 在 ListView 当中,透过点选设计在 ViewCell.ContextActions 的 "MenuItem 删除",并且透过Binding(系结) 自行设计的 Command 的方式,来完成 PeoplePage 当中的一笔联络人资料从联络人列表当中删除。

在本系列的 EP15 当中则是已经能让使用者在 PeoplePage 点选联络人列表的 ListView 当中某笔联络人的 "Button 打电话",透过 Xamarin.Essentials 的 PhoneDialer 所设计的 Open 方法,转跳进入到行动装置预设的拨打电话的 App,并且带入该笔联络人电话。

接下来本回 EP16 要来讨论一个问题,当在 EP14 设计的给 "MenuItem 删除" 所 Binding (系结)到的 DeleteCommand,其 DeleteCommand 的撰写是在 Models 底下的 Person 类别当中。

如果就 MVVM 框架的定义上来看,Models 当中又设计了 Command 来执行,也就是除了有跟 View 互动外还涉及了其他程序的功能执行,就框架的职责上来看感觉就比较怪一些。

所以该怎麽调整,让该 Command 能放在该页面所设计的 ViewModel 呢?

整体来说算是有两种 "作法" 可以处理此问题,我们就透过 EP16 与 EP17 两篇的篇幅来进行这个讨论吧~~~

GoGo!!!


在本系列文章的 EP10 当中,有提到在 ListView 当中设计 ItemTapped 的事件,并且在其事件注册的事件处理常式当中撰写了呼叫 ViewModel 当中所设计的 EditCommand 方法。

在本篇 EP16 就要来介绍类似的手法来完成喔!

首先,先找到再 Models 底下的 Person 类别,并且把先前 EP14 设计的 DeleteCommand 程序码剪下。
Person 类别设计 DeleteCommand

再到 PeoplePageViewModel 类别中把这段 DeleteCommand 给贴上,贴上之後要稍微修正一下,将 DeleteCommand 设计成可传参数的 Command 设计,并且执行集合删除的部分改成该参数的名称。
PeoplePageViewModel 类别增加 DeleteCommand

接着进到 PeoplePage.xaml 找到 ListView 标记,并在其 ViewCell.ContextActions 中的 MenuItem 标记中的 Command 撰写给删除。
PeoplePage 中的 MenuItem 标记删除 DeleteCommand

替换成 Clicked 的事件注册并设计其中的事件处理常式为 DeleteMenuItem_Clicked
PeoplePage 中的 MenuItem 标记增加 Clicked 事件与 DeleteMenuItem_Clicked 处理常式的注册

接着到 PeoplePage.xaml.cs 当中,找到刚刚建立的 DeleteMenuItem_Clicked 事件处理常式。
PoplePage.xaml.cs 当中的 DeleteMenuItem_Clicked 事件处理常式

编纂其 DeleteMenuItem_Clicked 事件处理常式的程序码。
编纂 DeleteMenuItem_Clicked 事件处理常式中的程序码

由於此为 MenuItem 的事件处理常式的事件处理常式,其设计的引数 sender 即会是 MenuItem 被当作物件参数传入,因此可以将 sender 转回 MenItem 并取得其 BindingContext,再将此 BindingContext 当作参数传入 DeleteCommand 的执行当中。

接下来就试着在双平台 (iOS、Android) 来执行看看。

针对 ListView 当中的联络人列表选取其中某笔联络人做删除的动作。
透过 ListView 设计与处理联络人删除 1

此动作会透由前面所设计的 DeleteMenuItem_Clicked 去呼叫 PeoplePageViewModel 里所撰写的 DeleteCommand 来执行。

执行 DeleteCommand 所设计的程序,并且出现 Alert 询问使用者是否真的要删除该笔联络人资讯。
透过 ListView 设计与处理联络人删除 2

如果使用者选择确定,则该笔资料从 MockData 的联络人当中删除,并从 ListView 的画面呈现中消失。
透过 ListView 设计与处理联络人删除 3

以上的执行,跟在 EP14 所完成的结果是不是都一样呢,哈!

如果是的话,那这样就将 Models 当中的 Person 类别所撰写的 DeleteCommand,成功的转移到 ViewModels 里的 PeoplePageViewModel 当中罗~~~

那...本篇 EP16 的部分就介绍到这边罗!

下篇 EP17 见唷~~~


<<:  Scanners API-价格篇 && Pandas设定

>>:  [DAY 19] 验算得分的理由及注意事项

Day 7 - Array Cardio Day 2

前言 JS 30 是由加拿大的全端工程师 Wes Bos 免费提供的 JavaScript 简单应用...

字串的动次踏次,Ruby 30 天刷题修行篇第四话

大家好,这里是 A Fei,又到了我们愉快的刷题练功时间,前三天的题型和 Number、Array ...

【Day29】为爬虫加上通知 - 成功收到 LINE 通知爬虫摘要讯息,专案大功告成!

除了要有专业外,你更要有技术整合的能力 笔者有话先说 这份专案所用到的各种技术都不难,难的是将这些...

JavaScript Array | 与其他程序语言很不同的阵列(上)

JavaScript Array (阵列) 阵列 (array) 是一个有序的序列,阵列中可以储存不...

Day 22 Reversing Array

要将array内的资料交换的方式有很多种,但我认为最直觉的是以下两种。 第一种:建立一个新的阵列然後...