另一个新手问题,尝试使用 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());
}
}
}
如果我还有什么需要发布的,我可以在编辑中进行。我认为问题出在命令绑定或导航设置中,但如果是的话,我不知道我做错了什么。也许很简单。帮忙吗?
您在 App.cs 中使用了
MainPage = new NavigationPage(new MainPlayerPage());
,因此您没有使用 AppShell,并且无法使用 Shell.Current.GoToAsync(pageName)
在 NavigationPage
中导航。
您可以在App.cs中将MainPage设置为AppShell(
MainPage = new AppShell();
),然后重试。