Hello, 各位 iT 邦幫忙 的粉絲們大家好~~~
在本系列文會利用目前 Visual Studio 內建的專案樣本建立一個初始的 .NET MAUI 專案,並且透過此 .NET MAUI 專案來把 TopStore App 的開發從 Xamairn.Forms 轉換到 .NET MAUI 上進行。
本篇是 Re: 從零改成用 .NET MAUI 技術來繼續過去用 Xamarin 開發的一個 App : TopStore 系列 系列文的 EP18。
跟各位常遇到的情況一樣,要開發這個 App 的客戶其實對自己想要的東西,其實也不是這麼有概念:
上圖取自 軟體開發經典圖的說明 再進行二次創作修改。
所以就出現了這樣的狀況:
回找 N 年前當初客戶給的商品資料範例檔第一版:
回找 N 年前當初客戶給的商品資料範例檔第二版:
所以後來規劃 App 在商品要記錄的資料欄位,主要是按照第二版商品資料範例的格式再配合第一版有的商品圖去設計:
首先,先在 Models 資料夾下增加一個新的類別檔案 "Product.cs":
幫它加上類似在 Person 當中用到的處理 "[INotifyPropertyChanged]" 跟 "public partical" 的設計:
另外,這邊發現用 Visual Studio 2022 長出來的類別範本還是預設採用舊式的寫法,有另外自己改成 "C# 10.0" 的 "File Scoped Namespaces" 寫法,才繼續下面動作。
把資料格式的設計先寫出來:
加上相關的欄位與屬性設計(可透過 "code snippet" 完成):
再針對屬性加上 "System.ComponentModel.DataAnnotations" 的描述:
完整的 Product.cs 程式碼如下:
using System.ComponentModel.DataAnnotations;
namespace TopStoreApp.Models;
[INotifyPropertyChanged]
public partial class Product
{
/// <summary>
/// 資料序號
/// </summary>
public int Id { get; set; }
/// <summary>
/// 商品編號
/// </summary>
private string _sn;
[Required(ErrorMessage = "商品編號是必填資料"), StringLength(50, ErrorMessage = "商品編號為 2 字以上", ErrorMessageResourceName = "商品編號不得超過 50 字", MinimumLength = 2)]
public string Sn
{
get { return _sn; }
set { SetProperty<string>(ref _sn, value); }
}
/// <summary>
/// 商品名稱
/// </summary>
private string _name;
[Required(ErrorMessage = "商品名稱必填資料"), StringLength(100, ErrorMessage = "商品名稱至少為 2 字以上" , ErrorMessageResourceName = "商品名稱不得超過 100 字", MinimumLength = 2)]
public string Name
{
get { return _name; }
set { SetProperty<string>(ref _name, value); }
}
/// <summary>
/// 商品照片(預設值為 tmp.jpg)
/// </summary>
private string _images;
public string Images
{
get { return _images; }
set { SetProperty<string>(ref _images, value); }
}
/// <summary>
/// 商品售價
/// </summary>
private decimal _price;
[Required(ErrorMessage = "商品售價必填資料"), Range(0, double.MaxValue, ErrorMessage = "必須為 0 元以上數值" )]
public decimal Price
{
get { return _price; }
set { SetProperty<decimal>(ref _price, value); }
}
/// <summary>
/// 商品建議售價 "Manufacturer's Suggested Retail Price" 之縮寫
/// </summary>
private decimal _msrp;
[Range(0, double.MaxValue, ErrorMessage = "必須為 0 元以上數值")]
public decimal Msrp
{
get { return _msrp; }
set { SetProperty<decimal>(ref _msrp, value); }
}
/// <summary>
/// 商品單位,範例: 罐、包、帶、袋、克、公克、台斤、公斤、磅、條...等
/// </summary>
private string _unit;
[Required(ErrorMessage = "商品單位為必填資料"), StringLength(40, ErrorMessage = "商品單位至少為 1 字以上", ErrorMessageResourceName = "商品單位不得超過 40 字", MinimumLength = 1)]
public string Unit
{
get { return _unit; }
set { SetProperty<string>(ref _unit, value); }
}
/// <summary>
/// 包裝個數
/// </summary>
private int _package;
[Range(1, int.MaxValue, ErrorMessage = "必須為 1 為單位以上數值")]
public int Package
{
get { return _package; }
set { SetProperty<int>(ref _package, value); }
}
/// <summary>
/// 商品備註
/// </summary>
private string _note;
[StringLength(500, ErrorMessage = "商品備註不得超過 500 字")]
public string Note
{
get { return _note; }
set { SetProperty<string>(ref _note, value); }
}
}
本 EP 介紹所完成的範例程式碼可在此下載。