我有一个应用程序,可以打开一个视图,使您可以搜索数据。但是,为了搜索,用户必须选择他要搜索的类别。当前,我正在尝试找出如何将所选类别从主视图模型(作为一个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<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
的{{1}}中的View2ViewModel
属性初始化为消息中的View2
值。我该如何实现?我考虑过在代码中实例化一个divisionIdnt
,将View2ViewModel
设置为message参数,然后设置新DivisionIdnt
的{{1}}到新创建的视图模型,如下所示:
DataContext
但是,这不起作用,因为在View2
中,构造函数有一个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();
}
}
由DI在运行时注入。
答案 0 :(得分:1)
您是否可以在实例化View2ViewModel之前不只是从容器中解析IDataService的实例?
如何执行此操作将取决于您所使用的DI容器,但是使用AutoFac时将是:
<button onClick="cnt()">click me</button>
或者,您可以从容器中解析View2ViewModel:
var findCredentialView = new View2();
var dataService = Container.Resolve<IDataService>();
var vm = new View2ViewModel(dataService);
vm.DivisionIdnt = divisionIdnt;
findCredentialView.DataContext = vm;
findCredentialView.ShowDialog();
由谁来为您进行ctor注射。
显然,这两种方法都要求您在运行时对容器进行引用,但是大多数应用程序/容器都为此提供了参考。如果没有,只需按照您的喜好通过服务/单例/静态在引导时暴露您的容器即可。
您可能还会发现此答案有帮助:How to handle dependency injection in a WPF/MVVM application
答案 1 :(得分:0)
您是否先尝试初始化视图模型,然后将其传递给视图?
public View2(View2ViewModel vm)
{
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 vm = new View2ViewModel();
vm.DivisionIdnt = divisionIdnt;
var findCredentialView = new View2(vm);
findCredentialView.ShowDialog();
}
}