如何使用Caliburn.micro EventAggregator MVVM在ViewModel之间传递值

我正在尝试使用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; }

将打开窗口以更新客户的UserControl之一:

    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)的必需形式参数“事件”相对应的参数。

yujian1314 回答:如何使用Caliburn.micro EventAggregator MVVM在ViewModel之间传递值

我知道了。它不是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的构造方法需要IEventAggregator类型的参数。代码中缺少此内容。

CustomerUpdateViewModel的构造器

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

在OP中调用构造函数,缺少参数

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

您在自己的答案中解决此问题的方法是将CustomerUpdateViewModel实例注入到CustomerViewModel中。这可能是不必要的步骤,例如,如果您没有在每次显示CustomerViewModel时都导航到CustomerUpdateViewModel。

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

public void UpdateCustomer()
{
    WindowManager wm = new WindowManager();
    CustomerUpdateViewModel cn = new CustomerUpdateViewModel(_events);
    wm.ShowWindow(cn);
}
本文链接:https://www.f2er.com/3149969.html

大家都在问