2016-09-10 1 views
1

Ich möchte innerhalb ausgewählten Seiten eine Zurück-Taste aufzunehmen. Aus irgendeinem Grund habe ich es "Breadcrumb" genannt, bitte nenne es "BackButton" :).umfassen XAML in XAML auf Xamarin Formen mit Prisma mvvm View-Modell. Kann nicht lösen INavigationService

Das Problem ist, dass der Navigationsdienst in der ioc bekommt nicht durchgezogen.

Hier ist der folgende Code mit Ausnahme i über komme:

Hauptseite XAML-Bekanntmachung der lokalen: BreadcrumbControl

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
      prism:ViewModelLocator.AutowireViewModel="True" 
      x:Class="Test.Views.MainPage" 
      xmlns:local="clr-namespace:Test.Views"> 

    <StackLayout> 
     <local:BreadcrumbControl x:Name="Breadcrumb" /> 
    </Stacklayout> 
<ContentPage> 

Brotkrumen-Steuerung XAML

<?xml version="1.0" encoding="utf-8" ?> 
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
      prism:ViewModelLocator.AutowireViewModel="True" 
      x:Class="Test.Views.BreadcrumbControl"> 

    <Button Text="Back" Command="{Binding NavigateCommand}" CommandParameter="NavigationPage/ManageFoodGroupsPage" /> 

</ContentView> 

Brotkrumen-Page View Modell

public class BreadcrumbControlViewModel : BindableBase 
{ 
    INavigationService navigationService; 

    public DelegateCommand<string> NavigateCommand { get; set; } 

    // If i uncomment the navigationservice the following error occurs (*) 
    public BreadcrumbControlViewModel(/*INavigationService navigationService*/) 
    { 
     this.navigationService = navigationService; 
     NavigateCommand = new DelegateCommand<string>(Navigate); 
    } 

    private void Navigate(string name) 
    { 
     navigationService.GoBackAsync(); 
    } 
} 

(*)

Eine Ausnahme vom Typ 'Microsoft.Practices.Unity.ResolutionFailedException' in Microsoft.Practices.Unity.dll aufgetreten war aber nicht im Benutzercode behandelt

Weitere Informationen: Auflösung der Abhängigkeit fehlgeschlagen, type = "Test.ViewModels.Bread crumbControlViewModel ", name =" (keine) ".

Ausnahme beim: Auflösen Parameter "Navigation" von Konstruktor Test.ViewModels.BreadcrumbControlViewModel (Prism.Navigation.INavigationService Navigation).

Ausnahme ist: Nullreferenceexception - Objektreferenz auf eine Instanz eines Objekts nicht gesetzt.


Zum Zeitpunkt der Ausnahme, war der Behälter:

Resolving Test.ViewModels.BreadcrumbControlViewModel, (none)

Auflösen Parameter "Navigation" von Constructor Test.ViewModels.BreadcrumbControlViewModel (Prism.Navigation.INavigationService Navigation)

A pp.cs Container/Resolver Registrierung

ViewModelLocationProvider.Register<BreadcrumbControl, BreadcrumbControlViewModel>(); 

Container.RegisterTypeForNavigation<MainPage>(); 

Wie ich mich über eine gemeinsame Back-Button Stil Sache einschließlich (durch ein Ansichtsmodell angetrieben) in einem Xamarin Forms Prism MVVM-Anwendung.

Antwort

1

Aufgrund der Art der Navigation in Xamarin.Forms (Seite basiert), die INavigationService funktioniert nur für Viewmodels, die Arten von Seite gehören. Es muss eine Seite sein, sonst haben Sie keine Möglichkeit zu navigieren. Wenn Sie den INavigationService in der VM von ContentView haben müssen, müssen Sie den INavigationService beim Container registrieren, aber er verhält sich möglicherweise nicht so, wie Sie erwarten würden, da er von der Application.Current.MainPage anstatt von der richtigen Page ausgeführt wird.

+0

#Startruck - Danke Brian, tolles Gespräch Sie auf Prism getan haben. Ich hatte bemerkt, dass es nicht möglich war, eine Seite in den XAML einzubetten, und deshalb griff ich auf die Ansicht zurück. Was ist Ihr Ansatz, wiederverwendbare Bits so zu bekommen? z.B. Ein Back-Button in vielen Seiten platziert ... während ich es an ein Model gebunden habe :) – Jimmyt1988

+0

Ich bin auf eine andere Art und Weise gegangen und habe ein Baseview-Model mit einigen der gebräuchlicheren Navigations-Bits erstellt. Ich denke, ich werde es jetzt tun müssen Finden Sie heraus, wie Sie stattdessen Ressourcen verwenden, die das Problem lösen sollten: D – Jimmyt1988

+1

Eine andere Möglichkeit, den Navigationsdienst zu erhalten, besteht darin, eine neue Schnittstelle namens INavigationServiceAware zu erstellen und dann den COnfigureViewModelLocator zu überschreiben und dann eine benutzerdefinierte Implementierung für die Auflösung von Objekten bereitzustellen. Sie können ein Beispiel hier sehen https://github.com/PrismLibrary/Prism/blob/master/Source/Xamarin/Prism.Unity.Forms/PrismApplication.cs#L26 –

1

ich für die anderen Registrierungen einen der Code sehen Sie getan haben, nicht. Haben Sie den NavigationService ordnungsgemäß registriert? In Ihrem Setup sollten Sie es in Ihrem App.cs registrieren, bevor Sie den Code registrieren, der es benötigt.

Außerdem sollten Sie ContainerControlledLifetimeManager verwenden. Dies implementiert es im Wesentlichen als Singleton (vorausgesetzt, Sie möchten, dass der gleiche NavigationService in Ihrer App weitergegeben wird). Dies erklärt here

Container.RegisterType<NavigationService>(new ContainerControlledLifetimeManager()); 
+0

Nun, es ist nur so, dass Prism das für mich für die Ansichtsmodelle zuvor getan hat, es ist nur so, dass es sich nicht darum kümmert, es in Ansichtsmodelle zu übergeben, die in einer Ansicht instanziiert werden. – Jimmyt1988

+0

Ich denke, weil es nicht registertypefornavigation verwendet, es wird es nicht für mich injizieren ... ich werde versuchen, meine eigene, danke – Jimmyt1988

Verwandte Themen