.Net Maui MVVM - 在页面/视图打开时填充 CollectionView 的最佳方法是什么?

Tod*_*d T 9 xaml xamarin.forms maui

我是 .Net Maui 的新手,但已完成 James Montemagno 的 4 小时研讨会。研讨会包括:

  1. 使用 CollectionView 创建页面
  2. 创建视图模型
  3. 创建调用数据服务来检索数据的异步方法
  4. 将异步方法配置为 ICommand
  5. 将数据模型列表绑定到 CollectionView
  6. 将命令绑定到按钮

单击该按钮即可工作并填充 CollectionView。当页面打开时,我将如何删除按钮并执行此操作?注意我尝试通过删除“[ICommand]”来修改该方法,但这不起作用。另外,这个操作应该在代码隐藏中还是在 ViewModel 中完成?

预先感谢您的帮助!

(模型视图)

public partial class FieldAssignedWbsViewModel : BaseViewModel

{
FieldAssignedWbsService fieldAssignedWbsService;
public ObservableCollection<FieldAssignedWbs> WbsList { get; set; } = new();

public FieldAssignedWbsViewModel(FieldAssignedWbsService fieldAssignedWbsService)
{
    Title = "Wbs Assigned";
    this.fieldAssignedWbsService = fieldAssignedWbsService;
}

[ICommand]
async Task GetFieldAssignedWbsListAsync()
{
    if (IsBusy)
        return;
    try
    {
        IsBusy = true;

        var wbsList = await fieldAssignedWbsService.GetFieldAssignedWbsList();

        if (WbsList.Count != 0)
            WbsList.Clear();

        foreach (var wbs in wbsList)
            WbsList.Add(wbs);
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
        await Shell.Current.DisplayAlert("Error!",
            $"Undable to get monkeys: {ex.Message}", "OK");
    }
    finally
    {
        IsBusy = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

}

(集合视图绑定)

<CollectionView BackgroundColor="Transparent"
                    ItemsSource="{Binding WbsList}"
                    SelectionMode="None">
Run Code Online (Sandbox Code Playgroud)

(代码隐藏页,错误调用命令方法)

public partial class FieldAssignedWbsPage : ContentPage
{
public FieldAssignedWbsPage(FieldAssignedWbsViewModel viewModel)
{
    InitializeComponent();
    BindingContext = viewModel;
    //The following call does not work 
    //Hover message: Non-invocable member... cannot be called like a method
    await viewModel.GetFieldAssignedWbsListCommand();  
}
}
Run Code Online (Sandbox Code Playgroud)

Jay*_*kar 15

尽管最初的答案非常有效,但我建议安装 Microsoft 的.NET MAUI Community Toolkit,然后使用其EventToCommand功能。

安装后,builder.UseMauiCommunityToolkit()添加CreateMauiApp()MauiProgram.cs.

然后,在相关的 XAML 页面中,添加此命名空间xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit",然后您应该能够使用此代码块来执行您想要的操作:

<ContentPage.Behaviors>
    <toolkit:EventToCommandBehavior
        EventName="Appearing"
        Command="{Binding GetFieldAssignedWbsListCommand}" />
</ContentPage.Behaviors>
Run Code Online (Sandbox Code Playgroud)

我相信这是一个稍微干净一点的解决方案,因为它避免了用任何代码填充代码隐藏,并使 UI 处理纯粹在ViewModel和 之间View


Jas*_*son 3

使用OnAppearing。您可能还需要GetFieldAssignedWbsList 公开

protected override async void OnAppearing()
{
  await viewModel.GetFieldAssignedWbsListCommand.Execute(null);  
}
Run Code Online (Sandbox Code Playgroud)