C# 如何使用Caliburn.micro EventAggregator MVVM在ViewModels之间传递值

C# 如何使用Caliburn.micro EventAggregator MVVM在ViewModels之间传递值,c#,wpf,mvvm,caliburn.micro,eventaggregator,C#,Wpf,Mvvm,Caliburn.micro,Eventaggregator,我试图理解并使用Caliburn micro实现EventAggregator。我是MVVM的新生。 我的目标:我想创建一个用于更新客户的窗口/弹出窗口。我希望能够使用同一窗口从不同的用户控件更新客户。我在这里可能完全不对劲,所以请原谅我缺乏知识 我的活动类别: private CustomerModel _selectedCustomer; public SelectedCustomerEvent(CustomerModel selectedCustomer) {

我试图理解并使用Caliburn micro实现EventAggregator。我是MVVM的新生。 我的目标:我想创建一个用于更新客户的窗口/弹出窗口。我希望能够使用同一窗口从不同的用户控件更新客户。我在这里可能完全不对劲,所以请原谅我缺乏知识

我的活动类别:

    private CustomerModel _selectedCustomer;

    public SelectedCustomerEvent(CustomerModel selectedCustomer)
    {
        _selectedCustomer = selectedCustomer;
    }

    public CustomerModel SelectedCustomer { get { return _selectedCustomer; } }
用于更新客户的我的弹出窗口/窗口:

    private IEventAggregator _events;
    public CustomerUpdateViewModel(IEventAggregator events)
    {
        _events = events;
        _events.Subscribe(this);
    }

    public void Handle(SelectedCustomerEvent message)
    {
        Customer = message.SelectedCustomer;
    }

    public CustomerModel Customer { get; private set; }
将打开窗口以更新客户的用户控件之一:

    private IEventAggregator _events;
    public CustomerViewModel(IEventAggregator events)
    {
        _events = events;
        _events.Subscribe(this);
    }
    ..........
    private CustomerModel _selectedCustomer;
    public CustomerModel SelectedCustomer
    {
        get { return _selectedCustomer; }
        set
        {
            _selectedCustomer = value;
            NotifyOfPropertyChange(() => SelectedCustomer);
            _events.PublishOnUIThread(new SelectedCustomerEvent(SelectedCustomer));
        }
    }

    public void UpdateCustomer()
    {
        WindowManager wm = new WindowManager();
        CustomerUpdateViewModel cn = new CustomerUpdateViewModel();
        wm.ShowWindow(cn);
    }

我现在的问题是,我在“new CustomerUpdateViewModel()”上遇到了一个错误,即:没有给出与CustomerUpdateViewModel(IEventAggregator)所需的形式参数“events”相对应的参数。

我发现了这一点。这不是eventaggregator的问题,而是导航的问题。我需要将WindowManager和ViewModel放入构造函数中,如下所示:

  public CustomerViewModel(IEventAggregator events, IWindowManager windowManager, CustomerUpdateViewModel customerUpdateVM)
    {
        _windowManager = windowManager;
        _customerUpdateVM = customerUpdateVM;

        _events = events;
        _events.Subscribe(this);
    }
并更改打开窗口的方法:

public void UpdateCustomer() => _windowManager.ShowDialog(_customerUpdateVM);

如错误所述,CustomerUpdateViewModel的构造函数需要类型为
IEventaggGator
的参数。代码中缺少此项

客户更新视图模型的构造函数

public CustomerUpdateViewModel(IEventAggregator events)
{
        _events = events;
        _events.Subscribe(this);
}
调用OP中的构造函数,缺少参数:

public void UpdateCustomer()
{
    WindowManager wm = new WindowManager();
    CustomerUpdateViewModel cn = new CustomerUpdateViewModel(); // Argument missing
    wm.ShowWindow(cn);
}
您在自己的回答中解决此问题的方法是将
CustomerUpdateViewModel
的实例注入
customerServiceWModel
。这可能是一个不必要的步骤,例如,如果您没有在每次显示
CustomerUpdateViewModel
时导航到
CustomerUpdateViewModel

相反,您仍然可以使用初始方法,仅在实际需要时初始化
CustomerUpdateViewModel
的实例。您只需要将
IEventAggregator
的实例传递给它

例如:

public void UpdateCustomer()
{
    WindowManager wm = new WindowManager();
    CustomerUpdateViewModel cn = new CustomerUpdateViewModel(_events);
    wm.ShowWindow(cn);
}