Навигация в приложении предприятияEnterprise App Navigation

Xamarin.Forms поддерживает навигацию по страницам, что обычно приводит к от взаимодействия пользователя с помощью пользовательского интерфейса или из самого приложения, в результате изменения внутреннего состояния на основе логики.Xamarin.Forms includes support for page navigation, which typically results from the user's interaction with the UI or from the app itself as a result of internal logic-driven state changes. Тем не менее Навигация может быть сложно реализовать в приложениях, использующих шаблон Model-View-ViewModel (MVVM), как должны быть выполнены следующие задачи:However, navigation can be complex to implement in apps that use the Model-View-ViewModel (MVVM) pattern, as the following challenges must be met:

  • Как определить представление для навигации, используя подход, который не вносит тесной связи и зависимости между представлениями.How to identify the view to be navigated to, using an approach that does not introduce tight coupling and dependencies between views.
  • Как для координации процесса, который создан и инициализирован представлении, чтобы осуществить переход.How to coordinate the process by which the view to be navigated to is instantiated and initialized. При использовании MVVM, представления и модель представления необходимо создать экземпляр и связанные друг с другом через контекст привязки для представления.When using MVVM, the view and view model need to be instantiated and associated with each other via the view's binding context. Когда приложение использует контейнер внедрения зависимостей, при создании экземпляра представления и Просмотр моделей может потребоваться механизм определенную конструкцию.When an app is using a dependency injection container, the instantiation of views and view models might require a specific construction mechanism.
  • Следует ли выполнить первое представление навигации или просмотреть навигации «сначала модель».Whether to perform view-first navigation, or view model-first navigation. С навигацией первое представление чтобы перейти к странице ссылается на имя типа представления.With view-first navigation, the page to navigate to refers to the name of the view type. Во время навигации создается экземпляр указанное представление, а также его соответствующей модели представления и другие зависимые службы.During navigation, the specified view is instantiated, along with its corresponding view model and other dependent services. Альтернативный подход — использовать представление навигации «сначала модель», где страницы, чтобы перейти к ссылается на имя типа модели представления.An alternative approach is to use view model-first navigation, where the page to navigate to refers to the name of the view model type.
  • Как для четко отделить навигационный поведение приложения через представления и Просмотр моделей.How to cleanly separate the navigational behavior of the app across the views and view models. Шаблон MVVM обеспечивает разделение между пользовательском Интерфейсе приложения и его представления и бизнес-логики.The MVVM pattern provides a separation between the app's UI and its presentation and business logic. Тем не менее поведение приложения часто будет охватывать пользовательского интерфейса и презентации части приложения.However, the navigation behavior of an app will often span the UI and presentations parts of the app. Пользователь часто будет инициации перехода из представления и представления будут заменены в результате перехода.The user will often initiate navigation from a view, and the view will be replaced as a result of the navigation. Тем не менее навигации также часто необходимо инициировать или координируемые из модели представления.However, navigation might often also need to be initiated or coordinated from within the view model.
  • Способ передачи параметров во время перехода в целях инициализации.How to pass parameters during navigation for initialization purposes. Например если пользователь переходит в режим для обновления сведений о заказе, данные заказа будет передаваться в представление так, чтобы отобразить правильные данные.For example, if the user navigates to a view to update order details, the order data will have to be passed to the view so that it can display the correct data.
  • Способы навигации координаты по оси, чтобы убедиться что всей определенных бизнес-правил.How to co-ordinate navigation, to ensure that certain business rules are obeyed. Например пользователи могут получать запрос перед переходе от представления, чтобы их можно устранить любые недопустимые данные или предложено отправить или отменить все изменения данных, которые были внесены в представлении.For example, users might be prompted before navigating away from a view so that they can correct any invalid data or be prompted to submit or discard any data changes that were made within the view.

В этой главе решают эти задачи, предоставляя NavigationService класс, используемый для выполнения Навигация по страницам основанная на модели представления.This chapter addresses these challenges by presenting a NavigationService class that's used to perform view model-first page navigation.

Примечание

NavigationService Используется приложение, предназначенное только для выполнения иерархическую навигацию между экземплярами ContentPage.The NavigationService used by the app is designed only to perform hierarchical navigation between ContentPage instances. С помощью службы для перехода между другими типами страницы может привести к непредвиденному поведению.Using the service to navigate between other page types might result in unexpected behavior.

Логика перемещения находятся в коде программной части представления, или в данных привязки модели представления.Navigation logic can reside in a view's code-behind, or in a data bound view model. Поместив логику навигации в представлении может быть самым простым подходом, не легко тестируемых через модульные тесты.While placing navigation logic in a view might be the simplest approach, it is not easily testable through unit tests. Поместив логику навигации в представлении классов модели означает, что логика может быть выполнено через модульные тесты.Placing navigation logic in view model classes means that the logic can be exercised through unit tests. Кроме того модель представления затем можно реализовать логику для управления навигации, чтобы убедиться, что применяются определенные бизнес-правила.In addition, the view model can then implement logic to control navigation to ensure that certain business rules are enforced. Например, приложение не может позволить пользователю уходите со страницы без предварительного обеспечивая правильность введенных данных.For example, an app might not allow the user to navigate away from a page without first ensuring that the entered data is valid.

Объект NavigationService класса обычно вызывается из модели представления, для обеспечения возможности тестирования.A NavigationService class is typically invoked from view models, to promote testability. Тем не менее переход к представлениям из модели представлений требуется Просмотр моделей, ссылающиеся на представления, и особенно представления, которые модель активное представление не связана с, а это не рекомендуется.However, navigating to views from view models would require the view models to reference views, and particularly views that the active view model isn't associated with, which is not recommended. Таким образом NavigationService представленные здесь указывает тип модели представления в качестве целевого объекта для перехода к.Therefore, the NavigationService presented here specifies the view model type as the target to navigate to.

Мобильное приложение eShopOnContainers использует NavigationService класс, предоставляющий навигации основанная на модели представления.The eShopOnContainers mobile app uses the NavigationService class to provide view model-first navigation. Этот класс реализует INavigationService интерфейс, который показан в следующем примере кода:This class implements the INavigationService interface, which is shown in the following code example:

public interface INavigationService  
{  
    ViewModelBase PreviousPageViewModel { get; }  
    Task InitializeAsync();  
    Task NavigateToAsync<TViewModel>() where TViewModel : ViewModelBase;  
    Task NavigateToAsync<TViewModel>(object parameter) where TViewModel : ViewModelBase;  
    Task RemoveLastFromBackStackAsync();  
    Task RemoveBackStackAsync();  
}

Этот интерфейс определяет, что класс, реализующий должен предоставить следующие методы:This interface specifies that an implementing class must provide the following methods:

МетодMethod ЦельPurpose
InitializeAsync Выполняет переход к одной из двух страниц, когда запускается приложение.Performs navigation to one of two pages when the app is launched.
NavigateToAsync Выполняет иерархическая навигация на указанной странице.Performs hierarchical navigation to a specified page.
NavigateToAsync(parameter) Выполняет иерархическая навигация на указанной странице, передавая параметр.Performs hierarchical navigation to a specified page, passing a parameter.
RemoveLastFromBackStackAsync Удаляет предыдущую страницу из стека навигации.Removes the previous page from the navigation stack.
RemoveBackStackAsync Удаляет все предыдущие страницы из стека навигации.Removes all the previous pages from the navigation stack.

Кроме того INavigationService интерфейс указывает, что должен предоставить класс, реализующий PreviousPageViewModel свойство.In addition, the INavigationService interface specifies that an implementing class must provide a PreviousPageViewModel property. Это свойство возвращает тип модели представления, связанные с предыдущей страницы в стеке навигации.This property returns the view model type associated with the previous page in the navigation stack.

Примечание

INavigationService Интерфейс обычно будет также указать GoBackAsync метод, который используется, чтобы вернуться на предыдущую страницу в стеке навигации программным образом.An INavigationService interface would usually also specify a GoBackAsync method, which is used to programmatically return to the previous page in the navigation stack. Тем не менее этот метод отсутствует в мобильном приложении eShopOnContainers, так как это не обязательно.However, this method is missing from the eShopOnContainers mobile app because it's not required.

Создав экземпляр NavigationServiceCreating the NavigationService Instance

NavigationService Класса, который реализует INavigationService интерфейсом, регистрируется как Singleton-класс с помощью контейнера внедрения зависимостей Autofac, как показано в следующем примере кода:The NavigationService class, which implements the INavigationService interface, is registered as a singleton with the Autofac dependency injection container, as demonstrated in the following code example:

builder.RegisterType<NavigationService>().As<INavigationService>().SingleInstance();

INavigationService Интерфейс разрешается в ViewModelBase конструктора класса, как показано в следующем примере кода:The INavigationService interface is resolved in the ViewModelBase class constructor, as demonstrated in the following code example:

NavigationService = ViewModelLocator.Resolve<INavigationService>();

Возвращает ссылку на NavigationService объект, хранящийся в Autofac контейнера внедрения зависимостей, который создается с InitNavigation метод в App класса.This returns a reference to the NavigationService object that's stored in the Autofac dependency injection container, which is created by the InitNavigation method in the App class. Дополнительные сведения см. в разделе перехода при запуске приложения.For more information, see Navigating When the App is Launched.

ViewModelBase Класса хранилищ NavigationService в экземпляре NavigationService свойство типа INavigationService.The ViewModelBase class stores the NavigationService instance in a NavigationService property, of type INavigationService. Таким образом, все просмотра классов модели, которые являются производными от ViewModelBase класса, можно использовать NavigationService свойство для доступа к методам, определяемое INavigationService интерфейс.Therefore, all view model classes, which derive from the ViewModelBase class, can use the NavigationService property to access the methods specified by the INavigationService interface. Это позволяет избежать затрат на внедрение NavigationService объекта из контейнера внедрения зависимостей Autofac в каждый класс модели представления.This avoids the overhead of injecting the NavigationService object from the Autofac dependency injection container into each view model class.

Обработка запросов навигацииHandling Navigation Requests

Xamarin.Forms предоставляет NavigationPage класс, который обеспечивает иерархическую навигацию, в котором пользователь может переходить по страницам вперед и назад по своему усмотрению.Xamarin.Forms provides the NavigationPage class, which implements a hierarchical navigation experience in which the user is able to navigate through pages, forwards and backwards, as desired. Дополнительные сведения об иерархической навигации см. в статье Иерархическая навигация.For more information about hierarchical navigation, see Hierarchical Navigation.

Вместо того чтобы использовать NavigationPage класса напрямую, в который заключается приложения eShopOnContainers NavigationPage в класс CustomNavigationView класса, как показано в следующем примере кода:Rather than use the NavigationPage class directly, the eShopOnContainers app wraps the NavigationPage class in the CustomNavigationView class, as shown in the following code example:

public partial class CustomNavigationView : NavigationPage  
{  
    public CustomNavigationView() : base()  
    {  
        InitializeComponent();  
    }  

    public CustomNavigationView(Page root) : base(root)  
    {  
        InitializeComponent();  
    }  
}

Этот перенос предназначена для упрощения стилей NavigationPage экземпляра в файле XAML для класса.The purpose of this wrapping is for ease of styling the NavigationPage instance inside the XAML file for the class.

Переходы выполняются внутри классов модели представления, вызвав один из NavigateToAsync методы, указав тип модели представления для страницы, на которой осуществляется переход к, как показано в следующем примере кода:Navigation is performed inside view model classes by invoking one of the NavigateToAsync methods, specifying the view model type for the page being navigated to, as demonstrated in the following code example:

await NavigationService.NavigateToAsync<MainViewModel>();

В следующем коде показано в примере NavigateToAsync методы, предоставляемые NavigationService класса:The following code example shows the NavigateToAsync methods provided by the NavigationService class:

public Task NavigateToAsync<TViewModel>() where TViewModel : ViewModelBase  
{  
    return InternalNavigateToAsync(typeof(TViewModel), null);  
}  

public Task NavigateToAsync<TViewModel>(object parameter) where TViewModel : ViewModelBase  
{  
    return InternalNavigateToAsync(typeof(TViewModel), parameter);  
}

Каждый метод позволяет любой класс модели представления, который является производным от ViewModelBase классом для выполнения иерархической навигации, вызвав InternalNavigateToAsync метод.Each method allows any view model class that derives from the ViewModelBase class to perform hierarchical navigation by invoking the InternalNavigateToAsync method. Кроме того второй NavigateToAsync метод позволяет указать как аргумент, передаваемый модели представления, куда выполняется переход, где он обычно используется для инициализации данных навигации.In addition, the second NavigateToAsync method enables navigation data to be specified as an argument that's passed to the view model being navigated to, where it's typically used to perform initialization. Дополнительные сведения см. в разделе передачи параметров во время навигации.For more information, see Passing Parameters During Navigation.

InternalNavigateToAsync Метод выполняет запрос навигации и показан в следующем примере кода:The InternalNavigateToAsync method executes the navigation request, and is shown in the following code example:

private async Task InternalNavigateToAsync(Type viewModelType, object parameter)  
{  
    Page page = CreatePage(viewModelType, parameter);  

    if (page is LoginView)  
    {  
        Application.Current.MainPage = new CustomNavigationView(page);  
    }  
    else  
    {  
        var navigationPage = Application.Current.MainPage as CustomNavigationView;  
        if (navigationPage != null)  
        {  
            await navigationPage.PushAsync(page);  
        }  
        else  
        {  
            Application.Current.MainPage = new CustomNavigationView(page);  
        }  
    }  

    await (page.BindingContext as ViewModelBase).InitializeAsync(parameter);  
}  

private Type GetPageTypeForViewModel(Type viewModelType)  
{  
    var viewName = viewModelType.FullName.Replace("Model", string.Empty);  
    var viewModelAssemblyName = viewModelType.GetTypeInfo().Assembly.FullName;  
    var viewAssemblyName = string.Format(  
                CultureInfo.InvariantCulture, "{0}, {1}", viewName, viewModelAssemblyName);  
    var viewType = Type.GetType(viewAssemblyName);  
    return viewType;  
}  

private Page CreatePage(Type viewModelType, object parameter)  
{  
    Type pageType = GetPageTypeForViewModel(viewModelType);  
    if (pageType == null)  
    {  
        throw new Exception($"Cannot locate page type for {viewModelType}");  
    }  

    Page page = Activator.CreateInstance(pageType) as Page;  
    return page;  
}

InternalNavigateToAsync Метод выполняет переход к модели представления, сначала вызывается метод CreatePage метод.The InternalNavigateToAsync method performs navigation to a view model by first calling the CreatePage method. Этот метод осуществляет поиск представление, соответствующее типу модели указанное представление и создает и возвращает экземпляр этого типа представления.This method locates the view that corresponds to the specified view model type, and creates and returns an instance of this view type. Обнаружение представления, соответствующую типу модели представления использует подход на основе соглашений, в который предполагается, что:Locating the view that corresponds to the view model type uses a convention-based approach, which assumes that:

  • Представления находятся в той же сборке, как типы модели представления.Views are in the same assembly as view model types.
  • Представления находятся в. Дочернее пространство имен представлений.Views are in a .Views child namespace.
  • Просмотр моделей находятся в. Дочернее пространство имен ViewModels.View models are in a .ViewModels child namespace.
  • Имена представлений соответствуют просмотреть имена модели, с помощью «Модель» удален.View names correspond to view model names, with "Model" removed.

При создании экземпляра представления, она сопоставляется с его соответствующей модели представления.When a view is instantiated, it's associated with its corresponding view model. Дополнительные сведения о том, как это происходит, см. в разделе автоматическое создание модели представления с указателем модели представления.For more information about how this occurs, see Automatically Creating a View Model with a View Model Locator.

Если создается представление LoginView, он упакован в новый экземпляр класса CustomNavigationView класса и назначены Application.Current.MainPage свойство.If the view being created is a LoginView, it's wrapped inside a new instance of the CustomNavigationView class and assigned to the Application.Current.MainPage property. В противном случае CustomNavigationView извлекается экземпляр и указано, что это не null, PushAsync метод вызывается для принудительной отправки представление создаваемого в стек навигации.Otherwise, the CustomNavigationView instance is retrieved, and provided that it isn't null, the PushAsync method is invoked to push the view being created onto the navigation stack. Тем не менее если полученный CustomNavigationView экземпляр null, представление создаваемого упакован в новый экземпляр класса CustomNavigationView класса и назначены Application.Current.MainPage свойство.However, If the retrieved CustomNavigationView instance is null, the view being created is wrapped inside a new instance of the CustomNavigationView class and assigned to the Application.Current.MainPage property. Этот механизм гарантирует, что во время навигации, добавляются страницы правильно в стек навигации при является пустым, и если она содержит данные.This mechanism ensures that during navigation, pages are added correctly to the navigation stack both when it's empty, and when it contains data.

Совет

Рассмотрите возможность кэширования страниц.Consider caching pages. Кэширование страниц приводит к потребление памяти для представления, которые в настоящее время не отображаются.Page caching results in memory consumption for views that are not currently displayed. Тем не менее без кэширования страниц это означает, что синтаксического анализа XAML и создания страниц и его модель представления будет выполняться в новой страницы осуществляется переход, что может повлиять на производительность для сложных страницы.However, without page caching it does mean that XAML parsing and construction of the page and its view model will occur every time a new page is navigated to, which can have a performance impact for a complex page. Для хорошо спроектированной страницы, которая не использует слишком много элементов управления производительность будет достаточно.For a well-designed page that does not use an excessive number of controls, the performance should be sufficient. Тем не менее кэширование страниц может помочь при обнаружении медленных страниц время загрузки.However, page caching might help if slow page loading times are encountered.

После создания и осуществлен переход, представление InitializeAsync метода связанное представление модели представления.After the view is created and navigated to, the InitializeAsync method of the view's associated view model is executed. Дополнительные сведения см. в разделе передачи параметров во время навигации.For more information, see Passing Parameters During Navigation.

При запуске приложения, InitNavigation метод в App класса вызывается.When the app is launched, the InitNavigation method in the App class is invoked. Этот метод показан в следующем примере кода:The following code example shows this method:

private Task InitNavigation()  
{  
    var navigationService = ViewModelLocator.Resolve<INavigationService>();  
    return navigationService.InitializeAsync();  
}

Создает новый метод NavigationService объекта в контейнер внедрения зависимостей Autofac и возвращает ссылку на него, перед вызовом его InitializeAsync метод.The method creates a new NavigationService object in the Autofac dependency injection container, and returns a reference to it, before invoking its InitializeAsync method.

Примечание

Когда INavigationService интерфейс разрешается путем ViewModelBase класса контейнера возвращает ссылку на NavigationService объект, который был создан при вызове метода InitNavigation.When the INavigationService interface is resolved by the ViewModelBase class, the container returns a reference to the NavigationService object that was created when the InitNavigation method is invoked.

В следующем коде показано в примере NavigationService InitializeAsync метод:The following code example shows the NavigationService InitializeAsync method:

public Task InitializeAsync()  
{  
    if (string.IsNullOrEmpty(Settings.AuthAccessToken))  
        return NavigateToAsync<LoginViewModel>();  
    else  
        return NavigateToAsync<MainViewModel>();  
}

MainView Выполняется переход к, если приложение имеет доступ кэшированный маркер, который используется для проверки подлинности.The MainView is navigated to if the app has a cached access token, which is used for authentication. В противном случае LoginView , к которому осуществляется переход.Otherwise, the LoginView is navigated to.

Дополнительные сведения о Autofac контейнера внедрения зависимостей, см. в разделе введение внедрения зависимостей.For more information about the Autofac dependency injection container, see Introduction to Dependency Injection.

Передача параметров во время навигацииPassing Parameters During Navigation

Один из NavigateToAsync методов, указанных по INavigationService интерфейс навигации данных как аргумент, передаваемый модели представления, куда выполняется переход, где он обычно используется для выполнения инициализации.One of the NavigateToAsync methods, specified by the INavigationService interface, enables navigation data to be specified as an argument that's passed to the view model being navigated to, where it's typically used to perform initialization.

Например ProfileViewModel класс содержит OrderDetailCommand , выполняется, когда пользователь выбирает заказ на ProfileView страницы.For example, the ProfileViewModel class contains an OrderDetailCommand that's executed when the user selects an order on the ProfileView page. В свою очередь, это выполняет OrderDetailAsync метод, который показан в следующем примере кода:In turn, this executes the OrderDetailAsync method, which is shown in the following code example:

private async Task OrderDetailAsync(Order order)  
{  
    await NavigationService.NavigateToAsync<OrderDetailViewModel>(order);  
}

Этот метод вызывает переход к OrderDetailViewModel, передав Order экземпляр, который представляет порядок, в котором пользователь выбрал в ProfileView страницы.This method invokes navigation to the OrderDetailViewModel, passing an Order instance that represents the order that the user selected on the ProfileView page. Когда NavigationService класс создает OrderDetailView, OrderDetailViewModel класса создается и назначенные представления BindingContext .When the NavigationService class creates the OrderDetailView, the OrderDetailViewModel class is instantiated and assigned to the view's BindingContext. После перехода по OrderDetailView, InternalNavigateToAsync выполняет метод InitializeAsync метод представления, связанного с модели представления.After navigating to the OrderDetailView, the InternalNavigateToAsync method executes the InitializeAsync method of the view's associated view model.

InitializeAsync Метод определен в ViewModelBase класса в качестве метода, который может быть переопределен.The InitializeAsync method is defined in the ViewModelBase class as a method that can be overridden. Этот метод задает object аргумент, который представляет данные, передаваемые модель представления во время операции навигации.This method specifies an object argument that represents the data to be passed to a view model during a navigation operation. Таким образом, классы модели представления, которые хотите получать данные из операции навигации предоставляют свою собственную реализацию InitializeAsync метод для выполнения инициализации.Therefore, view model classes that want to receive data from a navigation operation provide their own implementation of the InitializeAsync method to perform the required initialization. В следующем коде показано в примере InitializeAsync метода из OrderDetailViewModel класса:The following code example shows the InitializeAsync method from the OrderDetailViewModel class:

public override async Task InitializeAsync(object navigationData)  
{  
    if (navigationData is Order)  
    {  
        ...  
        Order = await _ordersService.GetOrderAsync(  
                        Convert.ToInt32(order.OrderNumber), authToken);  
        ...  
    }  
}

Этот метод извлекает Order экземпляр, который был передан в модели представления во время операции навигации и использует его для получения полного порядок сведения из OrderService экземпляра.This method retrieves the Order instance that was passed into the view model during the navigation operation, and uses it to retrieve the full order details from the OrderService instance.

Вызов навигации с помощью поведенийInvoking Navigation using Behaviors

Навигация обычно инициируется из представления взаимодействия с пользователем.Navigation is usually triggered from a view by a user interaction. Например LoginView выполняет навигации, после успешной проверки подлинности.For example, the LoginView performs navigation following successful authentication. В следующем примере кода показан способ вызова посредством поведения навигации:The following code example shows how the navigation is invoked by a behavior:

<WebView ...>  
    <WebView.Behaviors>  
        <behaviors:EventToCommandBehavior  
            EventName="Navigating"  
            EventArgsConverter="{StaticResource WebNavigatingEventArgsConverter}"  
            Command="{Binding NavigateCommand}" />  
    </WebView.Behaviors>  
</WebView>

Во время выполнения EventToCommandBehavior будет отвечать на действия с WebView .At runtime, the EventToCommandBehavior will respond to interaction with the WebView. Когда WebView переходит на веб-страницу Navigating событие будет срабатывать, которой будет выполнен NavigateCommand в LoginViewModel.When the WebView navigates to a web page, the Navigating event will fire, which will execute the NavigateCommand in the LoginViewModel. По умолчанию аргументы события для события передаются в команду.By default, the event arguments for the event are passed to the command. Эти данные преобразуются при передаче между источником и целью конвертера, указанный в EventArgsConverter свойство, которое возвращает Url из WebNavigatingEventArgs .This data is converted as it's passed between source and target by the converter specified in the EventArgsConverter property, which returns the Url from the WebNavigatingEventArgs. Таким образом, когда NavigationCommand будет выполнен, URL-адрес веб-страницы, передается в качестве параметра к зарегистрированному Action.Therefore, when the NavigationCommand is executed, the Url of the web page is passed as a parameter to the registered Action.

В свою очередь NavigationCommand выполняет NavigateAsync метод, который показан в следующем примере кода:In turn, the NavigationCommand executes the NavigateAsync method, which is shown in the following code example:

private async Task NavigateAsync(string url)  
{  
    ...          
    await NavigationService.NavigateToAsync<MainViewModel>();  
    await NavigationService.RemoveLastFromBackStackAsync();  
    ...  
}

Этот метод вызывает переход к MainViewModel, и выполнив навигации, удаляет LoginView страницу из стека навигации.This method invokes navigation to the MainViewModel, and following navigation, removes the LoginView page from the navigation stack.

Подтверждения или отмены навигацииConfirming or Cancelling Navigation

Взаимодействия с пользователем во время операции навигации, чтобы пользователь может подтвердить или отменить перемещение могут понадобиться приложению.An app might need to interact with the user during a navigation operation, so that the user can confirm or cancel navigation. Это может потребоваться, например, когда пользователь пытается перейти до полностью оформили страницы записи данных.This might be necessary, for example, when the user attempts to navigate before having fully completed a data entry page. В этом случае приложения должен предоставить уведомление, которое позволяет пользователю перемещаться за пределы страницы, или для отмены операции навигации, перед его выполнением.In this situation, an app should provide a notification that allows the user to navigate away from the page, or to cancel the navigation operation before it occurs. Это можно сделать в класс модели представления с помощью ответа для уведомления для управления, вызывается ли навигации.This can be achieved in a view model class by using the response from a notification to control whether or not navigation is invoked.

СводкаSummary

Xamarin.Forms поддерживает навигацию по страницам, что обычно приводит к от взаимодействия пользователя с помощью пользовательского интерфейса, или в приложении, в результате изменения внутреннего состояния на основе логики.Xamarin.Forms includes support for page navigation, which typically results from the user's interaction with the UI, or from the app itself, as a result of internal logic-driven state changes. Тем не менее навигации могут быть сложными для реализации в приложениях, использующих шаблон MVVM.However, navigation can be complex to implement in apps that use the MVVM pattern.

В этой главе представлены NavigationService класс, который используется для выполнения переходов основанная на модели представления из модели представления.This chapter presented a NavigationService class, which is used to perform view model-first navigation from view models. Поместив логику навигации в представлении классов модели означает, что логика может быть выполнено через автоматические тесты.Placing navigation logic in view model classes means that the logic can be exercised through automated tests. Кроме того модель представления затем можно реализовать логику для управления навигации, чтобы убедиться, что применяются определенные бизнес-правила.In addition, the view model can then implement logic to control navigation to ensure that certain business rules are enforced.