Xamarin Forms Prism: нужно ли передавать INavigationService в конструктор?Любой другой путь кроме инжектора конструктора - PullRequest
0 голосов
/ 14 ноября 2018

Для каркаса призмы в формах xamarin, для перехода от одного представления к другому, обязательно ли реализовывать инжектор конструктора и передавать INavigationService в конструктор ViewModel?

Я могу выполнить Навигацию при прохождении INavigationService как

public SomeViewModel(INavigationService navigationService)
{
  _navigationService.NavigateAsync("SomeOtherPage");
}

Но когда я пытаюсь решить, когда это необходимо, это не работает

public SomeViewModel(INavigationService navigationService)
    {
      ContainerProvider.Resolve<T>();// ContainerProvider is IContainerProvider
    }

Есть ли какой-либо другой способ доступа к INavigationService, кроме инъекции в конструктор в каждой Viewmodel

1 Ответ

0 голосов
/ 14 ноября 2018

То, что вы описываете, является анти-паттерном и, как правило, просто плохим дизайном.Это также не будет работать, потому что Навигационная Служба - это особая услуга.Он создается специально для каждой модели представления, поскольку служба навигации должна иметь контекст страницы, с которой вы осуществляете навигацию.Без этого он работал бы только для сброса стека навигации.Попытка разрешить службу навигации любым другим способом во ViewModel может привести к нарушению шаблона проектирования MVVM.

Если вы хотите использовать навигационную службу, вы должны внедрить ее через конструктор.Вы также можете просто использовать XAML Navigation в Prism 7.1.Вы можете увидеть образец с Prism Tests .Вы также можете увидеть это на практике в этом демонстрационном приложении .

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:xaml="clr-namespace:Prism.Navigation.Xaml;assembly=Prism.Forms"
             Title="{Binding Title}"
             x:Class="Prism.DI.Forms.Tests.Mocks.Views.XamlViewMockA">
    <Button x:Name="testButton" Command="{xaml:NavigateTo 'XamlViewMockB'}">
        <Button.CommandParameter>
            <xaml:NavigationParameters>
                <xaml:NavigationParameter Key="Foo" Value="Bar"/>
            </xaml:NavigationParameters>
        </Button.CommandParameter>
    </Button>
</ContentPage>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...