iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
Mobile Development

Re: 從零開始用 Xamarin 技術來復刻過去開發的一個 App : TopStore系列 第 6

EP 6: Use self-define Code Snippet to improve Coding Experience for design Command in ViewModel

  • 分享至 

  • xImage
  •  

Hello, 各位 iT邦幫忙 的粉絲們大家好~~~

本篇是 Re: 從零開始用 Xamarin 技術來複刻過去開發的一個 App: TopStore 系列文的 EP6。

不過在 EP5 該篇中,曾經有透過 Visual Studio 的快速修正功能自動產生 Person 類別後,運用在設計 People 這個屬性時所使用的 ObservableCollection 泛型設計當中,在此提醒一下原始長出來的 Person 類別會是透過 internal 修飾詞來設計該類別,各位可以根據專案的需求來修正與設計相關類別的修飾詞的存取權。

在該 EP5 篇中的介紹是配合既有的 code snippet 的設計,直接將該 Person 類別的修飾詞從 internal 改成 public 後繼續後面的撰寫,若真的有專案上的存取權設計考量也可將 People 屬性設計其修飾詞為 internal,這樣就不需要異動 Person 類別在透過 Visual Studio 產生時所預設的修飾詞 internal 喔。

而在 PeoplePageViewModel 的設計中,我們繼續來增加兩個 Command 第一個是 "新增" 聯絡人,而第二個則是 "編輯" 聯絡人的處理,並且變更其 PeoplePage 的 XAML 撰寫其 Binding (繫結)到 PeoplePageViewModel 的部分。

PeoplePageViewModel 的 Command 設計

來來來,開始囉~~~


增加第一個 "AddCommand",準備用來處理 "新增" 一筆聯絡人資料的功能。

其處理得作法上,也繼續利用到 EP5 提到的 code snippet 當中所設計的 "xfcmd" (各位把它叫做甚麼名字可以自己定義。)
PeoplePageViewModel 的 AddCommand 設計使用 xfcmd 的 code snippet 1

快速 Tab 兩下
PeoplePageViewModel 的 AddCommand 設計使用 xfcmd 的 code snippet 2

透過 Visual Studio 的修正加入 ICommand 所在 namespace 的 using 引用。
PeoplePageViewModel 的 AddCommand 設計使用 xfcmd 的 code snippet 3

透過 Visual Studio 的修正加入 Command 所在 namespace 的 using 引用。
PeoplePageViewModel 的 AddCommand 設計使用 xfcmd 的 code snippet 4

完成之後記得改一下 Command 的名字為 AddCommand。
PeoplePageViewModel 的 AddCommand 撰寫

可能大致上它的設計是直接跳到另外一個的頁面,不需要帶任何的參數,所以在這邊我們就會用到這個 "xfcmd" 的 code snippet。

而第二個 "EditCommand",準備用來處理 "編輯" 一筆聯絡人資料的功能。

其處理得作法上,也繼續利用到 EP5 提到的 code snippet 當中所設計的 "xftcmd" (各位把它叫做甚麼名字可以自己定義。)
PeoplePageViewModel 的 EditCommand 設計使用 xftcmd 的 code snippet 1

那 Edit 的 Command 在這個頁面的設計上可能就會傳遞 People 集合裡面,使用者所選到的某個 Person 的去進行 "編輯",所以在這邊選用了這個有參數設計的 Command。
PeoplePageViewModel 的 EditCommand 設計使用 xftcmd 的 code snippet 2

完成之後記得改一下 Command 的名字為 "EditCommand"。
PeoplePageViewModel 的 EditCommand 撰寫

所以可能大致上會有某種 Person 的資訊會被傳遞,你會看到這次這個透過 xftcmd" 產生的 Command 是有設計泛型 string 這個參數的一個帶入,到時候可能是帶入 People 的裡面選到的 Person 其中所設定的 Id 值。

那所以這樣子的一個結果完成的時候,在這個 PeoplePageViewModel 裡面先設計了一個 People 屬性與兩個 Command (Add & Edit)。
PeoplePageViewModel 的設計

接著再往下我們回到 PeoplePage.xaml 來變更一下 XAML 的設計。

首先是針對 PeoplePage 中 BindingContext 繫結的部分,加上 PeoplePageViewModel 的標記。
PeoplePage 的繫結到 PeoplePageViewModel 的設定 1

這個 BindingContext 一樣 Visual Studio 會提醒這個 PeoplePageViewModel 找不到。這道理很簡單,就是我們設計 Page 與 ViewModel 所在的 namespace 不同,所以就要在 XAML 裡面去引用這個 namespace,讓這個 XAML 可以去認識這個標記。
PeoplePage 的繫結到 PeoplePageViewModel 的設定 2

最後修正完成會是呈現成這個樣子。
PeoplePage 的繫結到 PeoplePageViewModel 的設定 3

在這個 TopStore 的 App 的 PeoplePage 裡面我們要去新增新的一筆 Person 資料,那我們就在頁面的 Navigation 列中新增一個 Add 選項,在設計上稱為 ContentPage.ToolbarItems 當中的 ToolbarItem。
PeoplePage 的 ContentPage.ToolbarItems 當中的 ToolbarItem 設計 1

那我們這邊就設計一個叫 ToolbarItem 的標記,並且將它的 Text 屬性設定為 "新增" 的文字,Command 屬性設定為使用 Binding (繫結)到前面 PeoplePageViewModel 所設計好的 AddCommand。
PeoplePage 的 ContentPage.ToolbarItems 當中的 ToolbarItem 設計 2

在這邊就結束這個 ToolbarItem 的標記設計,那結束之後就是下面的這個 ContentPage 的 Content 我們要不要做一個 Layout 上的修改,在這裡把 StackLayout 留著,原本的 Label 刪掉,改放 ListView 的標記,並且將它的 ItemSource 直接去設定 Binding 到 PeoplePageViewModel 的 People 這個 Property 上。

當 PeoplePage 的 XAML 相關繫結設定處理完成的時候,其他的一些設定大致上都是在做一些 ListView 本身的細微的調整,比如說像這個 HasUnevenRows 這個屬性會設定成 "True",而 CachingStrategy 屬性會設定成 "RecycleElement",基本上就至少對 ListView 做這些屬性設定的變更。
PeoplePage 的 ListView 使用

理論上在這個時候各別去 "Ctrl + F5" (執行但不偵錯)到 iOS 跟 Android 平台來確認一下畫面呈現的效果,那大概就是這樣子就可以做到這個結果。
iOS、Android 平台呈現畫面的效果

好的,調整完這些就將 Xamarin.Forms 的專案重新建置 (Ctrl + B),確認到目前為止所變更的程式碼在編譯上都沒問題後告個段落,後面就到下一篇 EP7 再繼續介紹囉!

謝謝各位,我們下篇見^_<


上一篇
EP 5: Use self-define Code Snippet to improve Coding Experience for NotifyProperty in ViewModel
下一篇
EP 7: Design the layout of item by DataTemplate in TopStore App
系列文
Re: 從零開始用 Xamarin 技術來復刻過去開發的一個 App : TopStore32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言