Имя «Навигация» не существует в текущем контексте (MAUI)

Это файл модели представления:

public partial class LoginViewModel : ObservableObject
{
    void Login()
    {
        Navigation.PushAsync(new HomePage()); // <== The name `Navigation` does not exist in the current context
    }
}

Почему Navigation нельзя получить доступ к файлам модели представления, но можно получить к .xaml.cs файлам?

Навигация — это свойство представления. Вы используете Shell или NavigationPage? (Шелл по умолчанию на мауи). Если вы используете Shell, прочитайте документ Maui Shell Navigation.

ToolmakerSteve 12.02.2023 06:52

Как указал ToolmakerSteve, только представления наследуют свойство Navigation. Как правило, я бы порекомендовал не выполнять никакой навигации непосредственно в вашей ViewModel, потому что это обычно нарушает шаблон MVVM, создавая зависимость от представления. Вы должны скрыть навигацию за интерфейсом и выполнять навигацию в реализации.

ewerspej 12.02.2023 10:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете оболочку, вы можете проверить документ .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 не должен знать о страницах. Более чистым решением было бы скрыть навигацию за другим интерфейсом, который абстрагирует зависимость от страниц.

ewerspej 13.02.2023 08:55

Другие вопросы по теме