如何在创建新视图时初始化视图模型中的属性?

我有一个应用程序打开一个允许您搜索数据的视图。 但是,为了进行搜索,用户必须选择他想要搜索的类别。 目前,我正在试图弄清楚如何将所选类别从主视图模型(作为int)传递到新搜索视图的视图模型。 目前我正在尝试在主视图中使用这样的东西:

假设我有两个视图View1View2各自的视图模型。 View2ViewlModel看起来像这样:

 public class View2ViewlModel : ViewModelBase { private IDataService _dataService; public int DivisionIdnt {get; set;} public View2ViewModel(IDataService dataService) { _dataService = dataService; } } 

View1我们在收到消息时创建并打开View2

 public View2() { InitializeComponent(); Messenger.Default.Register<NotificationMessage>(this, (m) => NotificationMesageReceived(m, m.Content)); } private void NotificationMesageReceived(NotificationMessage msg, int divisionIdnt) { if (msg.Notification == "SearchCred") { var findCredentialView = new View2(); findCredentialView.ShowDialog(); } } 

消息get在View1ViewModel传递,作为用户单击搜索按钮时发生的操作的一部分。 问题是我想将View2ViewModelDivisionIdnt属性初始化为新的View2View2ViewModel的forms表示消息的值。 我怎样才能做到这一点? 我考虑在代码中实例化View2ViewModel ,将DivisionIdnt设置为message参数,然后将新View2DataContext设置为新创建的viewmodel,如下所示:

 private void NotificationMesageReceived(NotificationMessage msg, int divisionIdnt) { if (msg.Notification == "SearchCred") { var findCredentialView = new View2(); var vm = new View2ViewModel(); vm.DivisionIdnt = divisionIdnt; findCredentialView.DataContext = vm; findCredentialView.ShowDialog(); } } 

但是,这不起作用,因为在View2ViewModel ,构造函数在运行时具有由DI注入的IDataService

在实例化View2ViewModel之前,你能不能从容器中解析IDataService的实例?

你如何做到这将取决于你正在使用哪个DI容器,但使用AutoFac它将是:

  var findCredentialView = new View2(); var dataService = Container.Resolve(); var vm = new View2ViewModel(dataService); vm.DivisionIdnt = divisionIdnt; findCredentialView.DataContext = vm; findCredentialView.ShowDialog(); 

或者,您可以从容器中解析View2ViewModel:

  var findCredentialView = new View2(); var vm = Container.Resolve(); vm.DivisionIdnt = divisionIdnt; findCredentialView.DataContext = vm; findCredentialView.ShowDialog(); 

哪个会照顾你的ctor注射。

显然,这两种方法都要求您在运行时引用容器,但大多数应用程序/容器都会为您提供此引用。 如果他们不这样做,只需根据您的喜好通过service / singleton / static在引导时暴露容器。

您可能还会发现此答案很有用: 如何在WPF / MVVM应用程序中处理依赖项注入

您是否尝试首先初始化viewmodel,然后将其传递给视图?

 public View2(View2ViewModel vm) { InitializeComponent(); Messenger.Default.Register>(this, (m) => NotificationMesageReceived(m, m.Content)); } private void NotificationMesageReceived(NotificationMessage msg, int divisionIdnt) { if (msg.Notification == "SearchCred") { var vm = new View2ViewModel(); vm.DivisionIdnt = divisionIdnt; var findCredentialView = new View2(vm); findCredentialView.ShowDialog(); } }