我有一个应用程序,可以打开一个 View ,使您可以搜索数据。但是,为了进行搜索,用户必须选择他要搜索的类别。当前,我正在尝试找出如何将所选类别从主 View 模型(作为一个int)传递到新搜索 View 的 View 模型。目前,我正在尝试在主 View 中使用以下内容:

假设我有两个 View View1View2,每个 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参数,然后将新DataContextView2设置为新创建的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

08-05 13:27