2016-10-20 3 views
0

übergibt Ich bin ziemlich neu zu PRISM und ich muss sagen, jeden Tag liebe ich es mehr und mehr! Zur Zeit habe ich mit einem Problem zu kämpfen, wie ein Parameter an die neu erstellte Ansicht übergeben wird (über Dependency Injection). Meine Situation ist wie folgt: Benutzer klickt auf eine Schaltfläche und eine neue Ansicht wird auf der rechten Seite des Bildschirms erstellt. Ich mache das wie folgt:Wie man Parameter an neu erstellte Ansicht über DI

IRegion region = this._regionManager.Regions [RegionNames.ActionRegion];

object boxView = region.GetView("BoxDetailsView"); 
if (boxView == null) 
     { 
     boxView = ServiceLocator.Current.GetInstance<BoxDetailsView>(); 
      region.Add(boxView, "BoxDetailsView"); 
     } 

     region.Activate(boxView); 

Das funktioniert ganz gut. Allerdings muss ich einen Parameter an diese Ansicht übergeben, und ich habe keine Ahnung, wie. OnNavigationVon & OnNaviagationTo funktioniert nicht, da ich nicht vom MainView navigiere, ich öffne nur eine zusätzliche Ansicht. Ich habe den sehr bekannten Stock Trader RI überprüft, aber ich habe immer noch keinen Weg gefunden dies zu erreichen.

Ich fühle mich wie ich bin sehr nah, aber etwas falsches tun. Kann jemand helfen?

Danke,

N.

Antwort

1

Ich empfehle die Verwendung des Navigationsframeworks. Verwenden Sie einfach RequestNavigate und übergeben Sie Parameter mit dem Methodenaufruf. Lassen Sie dann Ihr View/ViewModel INavigationAware implementieren und Sie haben dann Zugriff auf die Parameter, die Sie übergeben haben.

0

Im neu zu in Prisma, aber in meinem Projekt, das ich RegionContext Parameter als Ansichtsmodell zu untergeordneter Ansicht zu übergeben verwendet. (I verwendet Unity-Ansicht zu lösen)

Region in XAML (source):

<TabControl 
    regions:RegionManager.RegionName="{x:Static inf:RegionNames.ServerTabPartRegion}" 
    regions:RegionManager.RegionContext="{Binding CurrentServer, Mode=OneWay}"> 
    </TabControl> 

anzeigen Anmeldung (source)

public void Initialize() 
    { 
     _regionManager.RegisterViewWithRegion(RegionNames.ServerTabPartRegion, CreateView); 
    } 

    private object CreateView() 
    { 
     return ServerTabViewHelper.RegisterView<OnlinePlayers, ServerInfo, ServerMonitorPlayerViewModel>(_container, 
      "serverInfo"); 
    } 

Helper Parameter zu erhalten (source)

public static class ServerTabViewHelper 
{ 
    public static TView RegisterView<TView, TViewParameter, TViewModel>(IUnityContainer container, string parameterName) 
     where TView : FrameworkElement where TViewParameter : class 
    { 
     var view = container.Resolve<TView>(); 
     var context = RegionContext.GetObservableContext(view); 
     context.PropertyChanged += (s, e) => 
     { 
      var obs = s as ObservableObject<object>; 
      if (obs != null) 
      { 
       var serverInfo = obs.Value as TViewParameter; 
       var vm = container.Resolve<TViewModel>(new ParameterOverride(parameterName, serverInfo)); 
       view.DataContext = vm; 
      } 
     }; 
     return view; 
    } 
} 
0

Das Auflösen des Ansichtsmodells bei der Navigation hat den Vorteil, dass sich das Ansichtsmodell immer im initialisierten Zustand befindet (vorausgesetzt, Sie haben während der Navigation alle Daten verfügbar, um Verzögerungen zu vermeiden).

es mit Prisma zu tun, obwohl, müssen Sie eine modifizierte RegionNavigationService verwenden, da die Funktionalität nicht im Rahmen aufgenommen werden (ab jetzt sehen this issue) ...

Erweiterten ExecuteNavigation Methode :

[...update journal...] 

// Create and set the view model based on the navigation context 
var viewAsDependencyObject = view as DependencyObject; 
if (viewAsDependencyObject != null) 
{ 
    var createViewModelOnNavigateTo = ViewModelLocator.GetCreateViewModelOnNavigateTo(viewAsDependencyObject); 
    if (createViewModelOnNavigateTo) 
     ViewModelLocator.Bind(view, _viewModelProvider.CreateViewModel(viewAsDependencyObject, navigationContext)); 
} 

[...inform view...] 

Weitere Änderungen sind:

  • _viewModelProvider: einen Dienst ähnlich dem ViewModelLocator, die Viewmodel aus der NavigationContext
  • CreateViewModelOnNavigate schafft: eine angefügte Eigenschaft ähnlich wie AutoWireViewModel die Ansicht zu markieren, dass es ein neu erstellte Ansicht Modell erhalten soll, wenn es
0

Vielen Dank für Anregungen und Hinweise zur Navigation!Ich weiß es wirklich zu schätzen! Ich denke, Brians Vorschlag ist der einfachste und ich habe ihn so gelöst:

IRegion region = this._regionManager.Regions [RegionNames.ActionRegion];

 object boxView = region.GetView("BoxDetailsView"); 
     if (boxView == null) 
     { 
      boxView = ServiceLocator.Current.GetInstance<BoxDetailsView>(); 
      region.Add(boxView, "BoxDetailsView"); 
      // Navigate to view 
      var parameters = new NavigationParameters(); 
      parameters.Add("BOXID", param); 
      _regionManager.RequestNavigate(RegionNames.ActionRegion, new Uri("BoxDetailsView" + parameters, UriKind.Relative)); 

     } 
Verwandte Themen