我有一个应用程序,可以打开一个 View ,使您可以搜索数据。但是,为了进行搜索,用户必须选择他要搜索的类别。当前,我正在尝试找出如何将所选类别从主 View 模型(作为一个int)传递到新搜索 View 的 View 模型。目前,我正在尝试在主 View 中使用以下内容:
假设我有两个 View View1
和View2
,每个 View 都有各自的 View 模型。 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<int>>(this, (m) => NotificationMesageReceived(m, m.Content));
}
private void NotificationMesageReceived(NotificationMessage<int> msg, int divisionIdnt)
{
if (msg.Notification == "SearchCred")
{
var findCredentialView = new View2();
findCredentialView.ShowDialog();
}
}
消息的获取以
View1ViewModel
的形式传递,作为用户单击搜索按钮时发生的操作的一部分。 问题是我想将DivisionIdnt
中的View2ViewModel
属性初始化为新的View2
,使其成为消息中divisionIdnt
的值。我该如何实现? 我考虑过在代码中实例化View2ViewModel
,将DivisionIdnt
设置为message参数,然后将新DataContext
的View2
设置为新创建的viewmodel,如下所示:private void NotificationMesageReceived(NotificationMessage<int> 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注入(inject)了IDataService
。 最佳答案
在实例化View2ViewModel之前,您能否不仅从容器中解析IDataService的实例?
如何执行此操作将取决于您使用的DI容器,但是使用AutoFac时,它将是:
var findCredentialView = new View2();
var dataService = Container.Resolve<IDataService>();
var vm = new View2ViewModel(dataService);
vm.DivisionIdnt = divisionIdnt;
findCredentialView.DataContext = vm;
findCredentialView.ShowDialog();
或者,您可以从容器中解析View2ViewModel:
var findCredentialView = new View2();
var vm = Container.Resolve<View2ViewModel>();
vm.DivisionIdnt = divisionIdnt;
findCredentialView.DataContext = vm;
findCredentialView.ShowDialog();
它将为您处理ctor注入(inject)。
显然,这两种方法都要求您在运行时具有对容器的引用,但是大多数应用程序/容器都为此提供了引用。如果没有,只需按照您的偏好通过服务/单个/静态在引导时将您的容器暴露出来。
您可能还会发现此答案有帮助:How to handle dependency injection in a WPF/MVVM application