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

问题描述 投票:0回答:1

我正在尝试使用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)的所需形式参数“事件”相对应的参数。

c# wpf mvvm caliburn.micro eventaggregator
1个回答
0
投票

我知道了。它不是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);
© www.soinside.com 2019 - 2024. All rights reserved.