0

我在这里有一个简单的应用程序,但我不确定我的 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));                 

    }

}

查看.xaml.cs:

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

视图模型.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;
    }
}
4

1 回答 1

2

视图模型由Prism.Unity 程序集中类的DoGetInstance方法中的统一容器创建,该方法又通过该类的其他一些方法调用该方法。UnityServiceLocatorAdapterRegisterViewWithRegionRegionViewRegistry

Unity 能够自动解析视图模型类型,前提是它具有默认的无参数构造函数。

您可以使用以下代码自己验证这一点:

var view = unityContainer.Resolve(typeof(View), null); //will automatically resolve the view model type and inject the view with an instance of it
于 2017-01-31T16:03:35.460 回答