2017-06-30 4 views
1

Ich bin auf der Suche nach der besten Möglichkeit, ein ViewModel in eine Shell-Ansicht zu injizieren.Template10 MVVM IoC Inject ViewModel in Shell View

Ich verwende Autofac (aber ich kann Code aus anderen IoC-Containern übernehmen, wenn ein Muster verfügbar ist). Ich habe die anderen VMs korrekt injiziert - aber die Methode, die die VM mit der ResoleForPage-Methode der App-Klasse auflöst.

Ich bin ziemlich neu in UWP Entwicklung und jede Hilfe wird sehr geschätzt!

+0

Könnten Sie bitte einige Codes teilen? – Scavenger

Antwort

1

Das Übergeben eines ViewModel an die Shell ist in der Tat einfacher als das Übergeben an die anderen Seiten, da die Shell die einzige Seite ist, die von uns explizit erstellt wird: Es sollte also ausreichen, einen Parameter zum Konstruktor der Shell hinzuzufügen Shell vom Typ ShellViewModel:

public Shell() 
    { 
     Instance = this; 
     this.InitializeComponent(); 
    } 

    public Shell(INavigationService navService, ShellViewModel model) : this() 
    { 
     navigationMenu.NavigationService = navService; 
     navigationMenu.RefreshStyles(App.Current.RequestedTheme, true); 
     this.DataContext = model; 
    } 

dann setzen die Datacontext in einer stark typisierten Weise, wie bei allen anderen Seiten (nützlich, vor allem, wenn Sie verwenden x: Bind-Bindungen in xAML):

public ShellViewModel ViewModel => DataContext as ShellViewModel; 

Und jetzt Sie müssen nur eine Instanz Ihres ViewMo übergeben del Klasse, ziehen Sie es aus Ihrem IoC-Container, wenn Sie die Shell erstellen. In der Schablone Schablone 10 neuesten für VS2017, sollte es in der CreateRootElement Methode der App Klasse:

public override UIElement CreateRootElement(IActivatedEventArgs e) 
    { 
     var service = NavigationServiceFactory(BackButton.Attach, ExistingContent.Include); 
     return new Template10.Controls.ModalDialog 
     { 
      DisableBackButtonWhenModal = true, 
      Content = new Shell(service, new ShellViewModel()), 
     }; 
    } 

natürlich new ShellViewModel() mit dem Code ersetzt sie von Autofac zu ziehen.

+0

Perfekt, danke! Genau das, wonach ich gesucht habe. –