iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
Mobile Development

Re: 從零改用 .NET MAUI 技術來繼續過去用 Xamarin 技術開發的一個 App : TopStore系列 第 28

EP 28: Create ProductDetailPageViewModel for ProductDetailPage in TopStoreApp

  • 分享至 

  • xImage
  •  

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

在本系列文會利用目前 Visual Studio 內建的專案樣本建立一個初始的 .NET MAUI 專案,並且透過此 .NET MAUI 專案來把 TopStore App 的開發從 Xamairn.Forms 轉換到 .NET MAUI 上進行。

本篇是 Re: 從零改成用 .NET MAUI 技術來繼續過去用 Xamarin 開發的一個 App : TopStore 系列 系列文的 EP28。


繼前一回新增的 ProductDetailPage 完成能透過 GoodsPage 的 "列表項目" 點選進入,或是透過 "新增" 功能進入後,同樣的來完成對應的 ProductDetailPageViewModel 設計,並且能夠透過 Shell 執行轉跳功能時要帶入的參數,以利呈現兩者操作進入 ProductDetailPage 時有的不同效果。

找到 TopStoreApp 專案的 ViewModels 資料夾:
01-1

在 ViewModels 資料夾上右鍵選單中,選擇 "加入" -> "類別":
01-2

確認好建立的類別命名為 ProductDetailPageViewModel
01-3

改寫一下建立的類別檔,變成新版 C# 的撰寫風格:
01-4

變更類別的封裝關鍵字為 public 並加入 partial 之後,再繼承 BasePageViewModel
02-1

引用命名空間 using CommunityToolkit.Mvvm.ComponentModel; 並在此類別當中設計如下程式:

    [ObservableProperty]
    private Models.Product _editProduct;

    [ObservableProperty]
    private bool _isEdit;

完成結果如下圖紅框所示:
02-2

接著在此 ProductDetailPageViewModel 類別宣告的上方掛上 [QuryingProperty]Attritube

[QueryProperty(nameof(IsEditQueryString), "isEdit")]
[QueryProperty(nameof(ProductId), "productId")]

並在此 ProductDetailPageViewModel 類別當中設計對應 [QuryingProperty] 的屬性宣告:

    public string IsEditQueryString
    {
        set
        {
            IsEdit = bool.Parse(value);
        }
    }

    public int ProductId
    {
        set
        {
            int productId = value;
            if (productId > 0)
                EditProduct = App.DataService.GetProduct(productId);
        }
    }

完成結果如下圖紅框所示:
03-1

設計此類別的建構方法,並透過 App.DataService.NewProduct() 方法取得 Product 物件並設定給 EditProduct 屬性:

    public ProductDetailPageViewModel()
    {
        EditProduct = App.DataService.NewProduct();
    }

完成結果如下圖紅框所示:
03-2

最後再設計一個 Add() 方法,並在此方法上掛上 [RelayCommand]Attritube (注意上方的在命名空間的部分應該也會同時自動引入 using CommunityToolkit.Mvvm.Input;):

    [RelayCommand]
    private async void Save()
    {
        if (IsEdit)
        {
            var isValid = Utilities.ValidationHelper.IsValid(EditProduct, Shell.Current.CurrentPage);
            if (!isValid)
                return;

            App.DataService.SaveProduct(EditProduct);

            var isBack = await Shell.Current.DisplayAlert("通知", "儲存成功!", 
                                                          "返回物品項列表", "再檢視此筆資料");
            if (isBack)
            {
                await Shell.Current.GoToAsync("..");
            }
        }
        IsEdit = !IsEdit;
    }

完成結果如下圖紅框所示:
04

以上完成後可以先嘗試將整個專案 "重建"
05-1

最後在 Visual Studio 2022 的左下角應該會得的 "全部重建成功" 的訊息顯示:
05-2

本 EP 介紹所完成的範例程式碼可在此下載



上一篇
EP 27: Add ProductDetailPage and register to ShellRoute in TopStore
下一篇
EP 29: Design ProductDetailPage in TopStoreApp
系列文
Re: 從零改用 .NET MAUI 技術來繼續過去用 Xamarin 技術開發的一個 App : TopStore30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言