2017-04-06 4 views
0

INavigationService을 내 ViewModel에 삽입하려고 했으므로 페이지간에 이동할 수 있지만 ViewModel을 매개 변수로 등록하는 방법을 모르겠습니다. 여기 내 응용 프로그램입니다 :Xamarin.Forms에서 프리즘을 사용하여 페이지를 탐색하는 방법은 무엇입니까?

<prism:PrismApplication xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:prism="clr-namespace:Prism.Unity;assembly=Prism.Unity.Forms" 
      x:Class="PrismDemo.App" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      d1p1:Ignorable="d" xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006"> 
    <prism:PrismApplication.Resources> 
     <ResourceDictionary> 

     </ResourceDictionary> 
    </prism:PrismApplication.Resources> 
</prism:PrismApplication> 

및 ...

public partial class App 
{ 
    INavigationService _navigationService; 

    public App(IPlatformInitializer initializer = null) : base(initializer) { } 

    protected override void OnInitialized() 
    { 
     InitializeComponent(); 

     _navigationService = NavigationService; 
     NavigationService.NavigateAsync("MainNavigationPage/Start"); 
    } 

    protected override void RegisterTypes() 
    { 
     Container.RegisterTypeForNavigation<MainNavigationPage>(); 
     Container.RegisterTypeForNavigation<StartPage, StartPageViewModel>("Start"); 
     Container.RegisterTypeForNavigation<MiddlePage, MiddlePageViewModel>("Middle"); 
     Container.RegisterTypeForNavigation<LastPage, LastPageViewModel>("Last"); 
    } 
} 

가 어떻게 ViewModels에 _navigationService를 주입 할 수 있습니까? 당신은 실제로 직접만큼 당신이 뷰 모델에 INavigationService을 사용하려면 규칙 {MyProjectName}.Views.{MyPage}{MyProjectName}.ViewModels.{MyPageViewModel}

을 따랐다로 뷰 모델을 등록하지 않아도 도움

답변

1

에 대한

감사는 단순히 생성자에 추가합니다. 이름이 지정된 서비스이므로 반드시 navigationService으로 지정해야합니다. Samples Repo에서 몇 가지 예를 확인할 수 있습니다.

public class MyPageViewModel 
{ 
    INavigationService _navigationService { get; } 

    public MyPageViewModel(INavigationService navigationService) 
    { 
     _navigationService = navigationService; 

     NavigateCommand = new DelegateCommand<string>(OnNavigateCommandExecuted); 
    } 

    public DelegateCommand<string> NavigateCommand { get; } 

    public async void OnNavigateCommandExecuted(string path) => 
     await _navigationService.NavigateAsync(path); 
} 
+0

Dan 감사합니다.하지만 'INavigationService navigationService' 매개 변수를 viewmodel에 추가하면 예외가 발생합니다./ –

+0

@LouisaBickley가 문제의 저장소를 제공 할 수 있습니까? –

+0

죄송합니다. 문제의 원인이되는 일부 코드를 남겼습니다. 그것은 작동합니다. 감사! –

1

당신이 상속 것보다 당신이 Prism를 사용하는 경우는 AppPrismApplication에서 :

대신 public partial class App의는 public partial class App : PrismApplication해야한다.

이미 PrismApplicationNavigationService 재산에 선언 있기 때문에, 당신의 App 클래스 INavigationService _navigationService;를 선언 할 필요가 없습니다.

Container.RegisterType<ISomeService, SomeServiceImplementation>(); 

Unity container will automatically inject in constructor :

Prism

는 컨테이너에 등록 할 것, 의존성 삽입하면 수단 프레임 워크, 모든 것과 IUnityContainer를 사용

대상 클래스의 생성자를 정의하는 종속 클래스의 구체적인 유형을 매개 변수로 취합니다. Unity 컨테이너는 인스턴스를 인스턴스화하고 삽입합니다.

컨테이너에서

PrismApplication 레지스터 INavigationService, 그래서, 내가 이해, 당신이 당신의 자신의 인스턴스를 등록 할 필요가 없습니다 당신은 단지보기 모델의 인스턴스를 주입 할 것이다 연합 컨테이너의 생성자에서 유형 INavigationService의 매개 변수를 추가 할 수 있습니다 등록 된 유형. 중요한 점은 Prism이 네비게이션 서비스의 매개 변수 이름을 "예상"하기 때문에 정확하게 navigationService 매개 변수의 이름을 지정해야한다는 것입니다.

+0

입력 해 주셔서 감사합니다. 하지만 ... 당신이 말하길 : "프리즘을 사용한다면, PrismApplication으로부터 당신의 App을 상속 받아야한다. 대신에 public partial class app는 public partial class App : PrismApplication이어야한다. - 차이점이 뭐야? –

+0

차이점은'App' 클래스의 기본 클래스에 있습니다. –