Как создается эта модель представления?

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

Мой вопрос заключается в том, как ViewModel создается в коде View, когда я никогда не регистрировал тип ViewModel в контейнере Unity? Есть ли какая-то магия в методе 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;
    }
}

1 ответ

Решение

Модель представления создается контейнером единства в DoGetInstance метод UnityServiceLocatorAdapter класс в сборке Prism.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
Другие вопросы по тегам