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



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

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

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"相对应的参数。

我想明白了。这不是事件聚合器的问题,而是导航的问题。我需要把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(); // Argument 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);
}

最新更新