使用 .NET Maui,我在这个简单的命令导航场景中缺少什么?

问题描述 投票:0回答:1

另一个新手问题,尝试使用 RelayCommand 和 Navigation 类实现导航。我使用 MVVM 对 .NET Maui 进行了相当简单的设置。我有两个带有相应 ViewModel 的视图。我设置了一个导航,可以让我从主视图到编辑视图并再次返回。在主视图上放置一个按钮以导航到编辑视图,在编辑视图上放置一个按钮以导航回来。没有喜悦。它编译并运行,但它甚至不会导航到编辑视图......当我单击按钮时它什么也不做。我认为我在绑定到按钮的命令中弄乱了某些内容,或者可能是导航未正确绑定。

我将发布应该将我从 MainPlayerPage 导航到 EditPage 的代码...因为这不起作用,其余部分可以等待。

编辑:我认为问题出在命令绑定中。我尝试过替换不同的命令来更改第二个标签上的文本,但它似乎也不起作用。

我有一个 MainPlayerPage,其 xaml 如下所示:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MySolution.Mobile.MainPlayerPage"
             xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
             Title="MainPlayerPage">
    <VerticalStackLayout>
        <Label 
            Text="Welcome to Main Player Page!"
            FontAttributes="Bold"
            FontSize="24"
            VerticalOptions="Center" 
            HorizontalOptions="Center" />
        <Button Text="Navigate To Edit Page"
                FontAttributes="Bold"
                FontSize="36"
                Margin="5,20,5,5"
                Command="{Binding NavigateToEditPageCommand}">
        </Button>
        <Label
            Text="{Binding Identifier, StringFormat='From ViewModel: {0}'}"
            FontAttributes="Bold"
            FontSize="18"
            Margin="0,15,0,0">
        </Label>
    </VerticalStackLayout>
</ContentPage>

MainPlayerPage.xaml.cs 中的隐藏代码很简单,如下所示:

public partial class MainPlayerPage : ContentPage
{
    public MainPlayerPage()
    {
        InitializeComponent();
        BindingContext = new MainPlayerViewModel(new NavigationService());
    }
}

按钮后面的标签只是为了确认 BindingContext 已正确设置为从 ViewModel 中拉取,并且一定是因为该标签显示了 ViewModel 中 Identifier 属性的硬编码值。对应的ViewModel:

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using MySolution.Client.Core.Navigation;

namespace MySolution.Client.Core.ViewModels
{
    public partial class MainPlayerViewModel : ObservableObject
    {
        [ObservableProperty]
        private String _identifier = "Just to make sure the BindingContext is set properly...";

        private readonly INavigationService navigationService;

        public IAsyncRelayCommand NavigateToEditPageCommand;

        public MainPlayerViewModel(INavigationService navigationService)
        {
            this.navigationService = navigationService;
            NavigateToEditPageCommand = new AsyncRelayCommand(NavigateToEditPage);
        }

        private Task NavigateToEditPage()
            => navigationService.GoToEdit();
    }
}

导航服务如下所示:

namespace MySolution.Client.Core.Navigation
{
    public interface INavigationService
    {
        Task GoToEdit();
        Task GoBack();
    }
}

namespace MySolution.Mobile.Navigation
{
    public class NavigationService : INavigationService
    {
        private async Task Navigate(String pageName)
        {
            await Shell.Current.GoToAsync(pageName);
        }

        public Task GoToEdit() => Navigate("EditPage");

        public Task GoBack() => Shell.Current.GoToAsync("..");
    }
}

在 AppShell.xaml.cs 中,我注册路由如下:

    public partial class AppShell : Shell
    {
        public AppShell()
        {
            InitializeComponent();

            Routing.RegisterRoute("MainPlayerPage", typeof(MainPlayerPage));
            Routing.RegisterRoute("EditPage", typeof(EditPage));
            Routing.RegisterRoute("AboutPage", typeof(AboutPage));
        }
    }

最后,App.xaml.cs 如下所示:

namespace LifeTrax.Mobile
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            MainPage = new NavigationPage(new MainPlayerPage());
        }
    }
}

如果我还有什么需要发布的,我可以在编辑中进行。我认为问题出在命令绑定或导航设置中,但如果是的话,我不知道我做错了什么。也许很简单。帮忙吗?

routes data-binding command maui
1个回答
0
投票

您在 App.cs 中使用了

MainPage = new NavigationPage(new MainPlayerPage());
,因此您没有使用 AppShell,并且无法使用
Shell.Current.GoToAsync(pageName)
NavigationPage
中导航。

您可以在App.cs中将MainPage设置为AppShell(

MainPage = new AppShell();
),然后重试。

© www.soinside.com 2019 - 2024. All rights reserved.