iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0

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

在本系列文會延續 Re: 從零改用 .NET MAUI 技術來繼續過去用 Xamarin 技術開發的一個 App : TopStore 使用 .NET MAUI 技術所建立的 TopStore App ,更新 .NET MAUI 在 .NET 6 轉換到 .NET 7 時所需要調整的部分,並持續地的開發 TopStore App 其他需要的功能。

本篇是 Re: 從零續用 .NET MAUI 技術開發過去的一個 App : TopStore 系列 系列文的 EP20。


接著在 EP17 中 "下訂單" 的過程中,出現聯絡人列表後會由點選其中某個聯絡人的 "下訂單" 按鈕後,轉跳到 "物品項" 的列表頁面,以利進行 "下訂單" 過程當中的物品點選。

所以本 EP 就要來改造現在聯絡人列表當中的 "撥電話" 按鈕的功能為上述的 "下訂單" 功能,並轉跳到 "物品項" 的列表頁面。

首先,要變更聯絡人列表當中的 "撥電話" 按鈕並不難,找到 PeoplePage 上定義的 Button 標記,將其文字屬性與 Command 所繫結的 Path 作修改:

Text="下訂單"
Command="{Binding Source={RelativeSource AncestorType={x:Type viewmodels:PeoplePageViewModel}}, Path=MakeOrderCommand}"

完成結果如下圖:
01

當然,其 PeoplePage 所對應的 PeoplePageViewModel 也要定義出此 OrderingCommand ,找到 PeoplePageViewModel.cs 並在其類別設計中增加如下方法:

[RelayCommand]
private void MakeOrder(Person person)
{
    var routing = IsOrder ? $"//Orders/People/Goods?personId={person.Id}&isOrder=true" 
                            : $"//People/Goods?personId={person.Id}&isOrder=true";
    Shell.Current.GoToAsync(routing);
}

完成結果如下圖:
02

由上述 MakeOrder 方法的程式碼得知,要進行兩種不同的路由轉跳到 GoodsPage 呈現物品項列表。

接著再讓繼續開啟 AppShell.xaml.cs 並在其建構方法中來註冊該路由:

Routing.RegisterRoute("Orders/People/Goods", typeof(Pages.GoodsPage));
Routing.RegisterRoute("People/Goods", typeof(Pages.GoodsPage));

完成結果如下圖:
03

另外,由於物品項的頁面不再是單一出現的物件了,也來調整一下其 builder 建立物件的方式,開啟 MauiProgram.cs 找到 RegisterAppViewsAndViewModels 方法,進行變更:

builder.Services.AddTransient<Pages.GoodsPage>();
builder.Services.AddTransient<ViewModels.GoodsPageViewModel>();

完成結果如下圖:
04

而若會有疑問為何要設計兩種路由轉跳,理由很簡單,因為本來在聯絡人列表的按鈕變更為 "下訂單",那就可能直接在聯絡人列表發動 "下訂單",無須透過訂單列表的 "新增" 發動 "下訂單"。

因此轉跳的行為方式就會有所不同囉~~~

由聯絡人列表發動 "下訂單":
05-1_Android

由訂單列表的 "新增" 發動 "下訂單":
05-2_Android

而如果還有印象先前撰寫 GoodsPage 時預留的設計,其實物品項列表的物品項也要能發動 "下訂單":
05-3_Android

不過第三種發動 "下訂單" 的頁面轉跳會更為特殊,在這邊就先不討論這部份了~~~

接著會發現,"下訂單" 要進入到 GoodsPage 的時候也會隱藏下方的頁籤,其處理作法跟 EP18 的作法極為雷同,以下就速速來完成吧~~~

將 GoogsPage 的 ContnetPage 標記增加 Shell.TabBarIsVisible 設定值:

Shell.TabBarIsVisible="{Binding IsOrder, Converter={StaticResource BoolReverseValueConverter}}"

完成結果如下圖:
06

接著找到 ViewModels 當中的 GoogsPageViewMode,並幫其設計增加接收參數與設定的 IsOrder 屬性。

增加路由參數處理:

[QueryProperty(nameof(IsOrderQueryString), "isOrder")]

增加可繫結屬性:

[ObservableProperty]
private bool _isOrder;

public string IsOrderQueryString
{
    set
    {
        IsOrder = bool.Parse(value);
    }
}

完成結果如下圖:
07

以上完成~~~


上一篇
EP19
下一篇
EP21
系列文
Re: 從零續用 .NET MAUI 技術開發過去的一個 App : TopStore 系列30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言