iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0

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

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

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


在上一回當中可以看到 Product 資料正確的顯示在 GoodsPage 這個 "物品項" 的頁籤之後,接著繼續到 GoodsPageViewModel 中來設計在 GoodsPage 當中所需要的功能操作。

首先,開啟 "ViewModels" 資料夾底下的 "GoodsPageViewModel.cs"
01

接著加入以下方法的設計:

[RelayCommand]
private void Add()
{

}

[RelayCommand]
private void Edit(Models.Product product)
{

}

[RelayCommand]
private void Delete(Models.Product product)
{

}

[RelayCommand]
private void MakeOrder(Models.Product product)
{

}

[RelayCommand]
private void Search(string keyword)
{

}

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

而注意到每個方法上都會掛上 [RelayCommand] 的這個 Attritube,並且會看到檔案的上面引用命名空間的撰寫處 Visual Studio 2022 應該也會協助 "自動" 會引用:

using CommunityToolkit.Mvvm.Input;

確認的部分如下圖紅框所示:
02-2

接著就逐步完成每個方法的設計了,首先來看看前三個方法 Add()Edit()Delete()

    [RelayCommand]
    private async void Add()
    {
        await Shell.Current.DisplayAlert("Alert", "ProductDetailPageNotImplement", "Cancel");
        //await Shell.Current.GoToAsync("//Goods/ProductDetail?isEdit=true");
    }

    [RelayCommand]
    private async void Edit(Models.Product product)
    {
        await Shell.Current.DisplayAlert("Alert", $"You select the {product.Name}, " +
                                                  $"but ProductDetailPageNotImplement", "Cancel");
        //await Shell.Current.GoToAsync($"//Goods/ProductDetail?isEdit=false&productId={product.Id}");
    }

    [RelayCommand]
    private async void Delete(Models.Product product)
    {
        var isOk = await Shell.Current.DisplayAlert("警告", $"確定\"{product.Name}\"刪除?", "確定", "取消");
        if (isOk)
        {
            App.DataService.DeleteProduct(product);
            Goods = App.DataService.GetGoods();
        }
    }

完成的結果如下圖紅框所示:
02-3-1

而注意綠框的部分 async 關鍵字是當在方法撰寫中有用到 await 關鍵字的時候(打字輸入,複製貼上不算),Visual Studio 2022 會自動協助在方法的簽章上加入。

另外,因為目前 "TopStoreApp" 尚未設計 ProductDetailPage ,所以先暫時透過 DisplayAlert() 作為 UI 介面的代表,以確保在下一回進到 XAML 畫面設定 Command 繫結後,UI 都能有所顯示的反應。

再來接著設計 MakerOrder()Search() 的兩個方法:

    [RelayCommand]
    private async void MakeOrder(Models.Product product)
    {
        await Shell.Current.DisplayAlert("Alert", "MakeOrderPageNotImplement", "Cancel");
        //await Shell.Current.GoToAsync($"//Orders/MakeOrder?productId={product.Id}");
    }

    [RelayCommand]
    private async void Search(string keyword)
    {
        var results = App.DataService.GetGoods(keyword);
        if (results.Count != 0)
        {
            Goods = results;
            return;
        }
        await Shell.Current.DisplayAlert("通知", "查無相關貨品", "OK");
    }

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

而注意綠框的部分 async 關鍵字是當在方法撰寫中有用到 await 關鍵字的時候(打字輸入,複製貼上不算),Visual Studio 2022 會自動協助在方法的簽章上加入。

另外,因為目前 "TopStoreApp" 尚未設計 MakeOrderPage ,所以先暫時透過 DisplayAlert() 作為 UI 介面的代表,以確保在下一回進到 XAML 畫面設定 Command 繫結後,UI 都能有所顯示的反應。

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

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

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



上一篇
EP 23: Design the DataTemplate of CollectionView.ItemTemplate by SwipeView for GoodsPage
下一篇
EP 25: Design the binding of Commands for GoodsPage in TopStoreApp
系列文
Re: 從零改用 .NET MAUI 技術來繼續過去用 Xamarin 技術開發的一個 App : TopStore30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言