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

时间:2018-07-13 15:01:07

标签: c# wpf mvvm mvvm-light

我有一个应用程序,可以打开一个视图,使您可以搜索数据。但是,为了搜索,用户必须选择他要搜索的类别。当前,我正在尝试找出如何将所选类别从主视图模型(作为一个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<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在运行时注入。

2 个答案:

答案 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();
    }
}