2017-01-31 19 views
0

У меня здесь простое приложение, но я не уверен, как создается моя ViewModel. Я предполагаю, что это из контейнера единства, но я не уверен и любопытна. Модуль инициализирует и регистрирует представление с областью. В коде представления есть ViewModel, инициализированный в его конструкторе, и ViewModel вызывает некоторые службы, которые ранее были зарегистрированы.Как создается этот viewModel?

Мой вопрос: как выглядит ViewModel в коде View, когда я никогда не регистрировал тип ViewModel с контейнером единства? Есть ли какая-то магия в методе RegisterViewWithRegion?

AlarmsModule.cs: Это просто регистрирует вид с областью

[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; 
    } 
} 

ответ

2

Модель точка зрения созданный контейнером единства в методе DoGetInstance класса UnityServiceLocatorAdapter в Призме .Unity, который, в свою очередь, вызван методом RegisterViewWithRegion с помощью некоторых других методов класса RegionViewRegistry.

Unity может автоматически разрешать тип модели представления при условии, что у него есть конструктор без параметров без параметров.

Вы можете проверить это самостоятельно, используя следующий код:

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, спасибо! –