如何在创建新视图时初始化视图模型中的属性?
我有一个应用程序打开一个允许您搜索数据的视图。 但是,为了进行搜索,用户必须选择他想要搜索的类别。 目前,我正在试图弄清楚如何将所选类别从主视图模型(作为int)传递到新搜索视图的视图模型。 目前我正在尝试在主视图中使用这样的东西:
假设我有两个视图View1
和View2
各自的视图模型。 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
传递,作为用户单击搜索按钮时发生的操作的一部分。 问题是我想将View2ViewModel
的DivisionIdnt
属性初始化为新的View2
以View2ViewModel
的forms表示消息的值。 我怎样才能做到这一点? 我考虑在代码中实例化View2ViewModel
,将DivisionIdnt
设置为message参数,然后将新View2
的DataContext
设置为新创建的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(); } }