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 資料夾:

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

確認好建立的類別命名為 ProductDetailPageViewModel:
改寫一下建立的類別檔,變成新版 C# 的撰寫風格:
變更類別的封裝關鍵字為 public 並加入 partial 之後,再繼承 BasePageViewModel:
引用命名空間 using CommunityToolkit.Mvvm.ComponentModel; 並在此類別當中設計如下程式:
[ObservableProperty]
private Models.Product _editProduct;
[ObservableProperty]
private bool _isEdit;
完成結果如下圖紅框所示:

接著在此 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);
}
}
完成結果如下圖紅框所示:

設計此類別的建構方法,並透過 App.DataService.NewProduct() 方法取得 Product 物件並設定給 EditProduct 屬性:
public ProductDetailPageViewModel()
{
EditProduct = App.DataService.NewProduct();
}
完成結果如下圖紅框所示:

最後再設計一個 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;
}
完成結果如下圖紅框所示:

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

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

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