2017-01-31 9 views
0

Ich habe hier eine einfache Anwendung, aber ich bin mir nicht sicher, wie mein ViewModel erstellt wird. Ich gehe davon aus, dass es aus der Einheit Container ist, aber ich bin unsicher und neugierig. Das Modul initialisiert und registriert die Ansicht mit der Region. Der Code der Sicht hinter der Sicht hat das ViewModel in seinem Konstruktor initialisiert und das ViewModel ruft einige Dienste auf, die zuvor registriert wurden.Wie wird dieses ViewModel erstellt?

Meine Frage ist, wie ist das ViewModel im Code der Ansicht erstellt, wenn ich nie den ViewModel-Typ mit dem Einheits-Container registriert habe? Tritt in der Methode "RegisterViewWithRegion" etwas Magisches auf?

AlarmsModule.cs: Dieses Register einfach die Ansicht mit der Region

[Module(ModuleName = "AlarmsModule")] 
public class AlarmsModule : IModule 
{ 
    [Dependency] 
    public IRegionManager regionManager { get; set; } 

    public void Initialize() 
    {   

     regionManager.RegisterViewWithRegion("AlarmsRegion", typeof(AlarmPanel.View));     

    } 

} 

View.xaml.cs:

public partial class View : UserControl 
{ 
    public View(ViewModel vm) 
    { 
     InitializeComponent(); 
     DataContext = vm; 
    } 
} 

ViewModel.cs

public class ViewModel: DependencyObject 
{ 
    IEventAggregator _eventAggregator; 

    public ObservableCollection<IAlarmContainer> AlarmList { get; set; } 

    IAlarmService _alarmService; 
    public ViewModel(IAlarmService alarmService) 
    { 
     //Adding an alarm from the alarm service, which is injected into this viewModel 
     AlarmList = alarmService.AlarmList; 
    } 
} 

Antwort

2

Die Ansicht Modell ist erstellt von der Einheit Container in der DoGetInstance Methode der UnityServiceLocatorAdapter Klasse in der Prism .Unity Assembly, die wiederum durch die RegisterViewWithRegion Methode durch einige andere Methoden der RegionViewRegistry Klasse aufgerufen wird.

Unity kann den View-Modelltyp automatisch auflösen, vorausgesetzt, dass er über einen parameterlosen Standardkonstruktor verfügt.

Sie dies überprüfen, könnte sich mit dem folgenden Code:

var view = unityContainer.Resolve(typeof(View), null); //will automatically resolve the view model type and inject the view with an instance of it 
+0

Awesome, danke! –

Verwandte Themen