Как передать значения между ViewModels, используя Caliburn.micro EventAggregator MVVM - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь понять и реализовать EventAggregator, используя Caliburn micro. Я новый студент 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 ()", которое говорит:не указан аргумент, соответствующий обязательному формальному параметру 'events' в CustomerUpdateViewModel (IEventAggregator).

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Как описывает ошибка, для конструктора для 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. Это может быть ненужным шагом, если, например, вы не переходите к CustomerUpdateViewModel каждый раз, когда отображаете CustomerViewModel.

Вместо этого вы все равно можете использовать свой первоначальный подход и инициализировать экземпляр CustomerUpdateViewModel только тогда, когда он вам действительно нужен. Вам нужно только передать ему экземпляр IEventAggregator. Например,

public void UpdateCustomer()
{
    WindowManager wm = new WindowManager();
    CustomerUpdateViewModel cn = new CustomerUpdateViewModel(_events);
    wm.ShowWindow(cn);
}
0 голосов
/ 06 ноября 2019

Я понял это. Это не было проблемой с 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...