Это файл модели представления:
public partial class LoginViewModel : ObservableObject
{
void Login()
{
Navigation.PushAsync(new HomePage()); // <== The name `Navigation` does not exist in the current context
}
}
Почему Navigation
нельзя получить доступ к файлам модели представления, но можно получить к .xaml.cs
файлам?
Как указал ToolmakerSteve, только представления наследуют свойство Navigation
. Как правило, я бы порекомендовал не выполнять никакой навигации непосредственно в вашей ViewModel, потому что это обычно нарушает шаблон MVVM, создавая зависимость от представления. Вы должны скрыть навигацию за интерфейсом и выполнять навигацию в реализации.
Если вы используете оболочку, вы можете проверить документ .NET MAUI Shell navigation.
Shell включает в себя навигацию на основе URI, которая использует маршруты для перехода на любую страницу в приложении без необходимости следовать установленной иерархии навигации. Кроме того, он также предоставляет возможность навигации назад без необходимости посещения всех страниц в стеке навигации.
Конечно, если вам действительно нужно перемещаться по вашей ViewModel, вы можете попробовать передать Navigation
через VM Constructor. Поскольку страницы наследуются от VisualElement
, они напрямую наследуют свойство навигации.
public class LoginViewModel
{
public INavigation Navigation { get; set; }
public ICommand ContinueBtnClicked { get; set; }
public LoginViewModel(INavigation navigation)
{
this.Navigation = navigation;
this.ContinueBtnClicked = new Command(async () => await GotoNextPage());
}
public async Task GotoNextPage()
{
await Navigation.PushAsync(new NextPage());
}
}
Логинпаже.xaml
<?xml version = "1.0" encoding = "utf-8" ?>
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x = "http://schemas.microsoft.com/winfx/2009/xaml"
x:Class = "MauiApp210.LoginPage"
Title = "LoginPage">
<VerticalStackLayout>
<Label
Text = "Welcome to .NET MAUI!"
VerticalOptions = "Center"
HorizontalOptions = "Center" />
<Button Text = "Navigate" Command = "{Binding ContinueBtnClicked}"/>
</VerticalStackLayout>
</ContentPage>
Логинпаже.xaml.cs
public partial class LoginPage : ContentPage
{
public LoginPage()
{
InitializeComponent();
this.BindingContext = new LoginViewModel(Navigation);
}
}
Это нарушает шаблон MVVM, ViewModel не должен знать о страницах. Более чистым решением было бы скрыть навигацию за другим интерфейсом, который абстрагирует зависимость от страниц.
Навигация — это свойство представления. Вы используете Shell или NavigationPage? (Шелл по умолчанию на мауи). Если вы используете Shell, прочитайте документ Maui Shell Navigation.