Caliburn Micro, Уведомлять, когда свойство в объекте nedted изменяется - PullRequest
1 голос
/ 14 мая 2019

Я занимаюсь разработкой приложения C # WPF для управления данными. Я использую шаблон MVVM с платформой Caliburn Micro.
У меня есть кнопка, которая должна нажиматься только тогда, когда определенное текстовое поле с именем не пусто.


Моя проблема в том, что при вводе текста в текстовое поле CanSaveSelection не получает уведомления и поэтому не проверяет, является ли оно пустым.

public class MainWorkspaceViewModel : PropertyChangedBase
{
    private Car _myCar;
    public Car MyCar
    {
        get { return _myCar; }
        set
        {
            _myCar = value;
            NotifyOfPropertyChange(() => CanSaveSelection);
        }
    }

    public void SaveSelection()
    {
        //Do something
    }

    public bool CanSaveSelection
    {
        get
        {
            bool result = true;

            if (String.IsNullOrWhiteSpace(MyCar.Manufacturer.Name))
            {
                result = false;
            }
            return result;
        }
    }
}

Объекты:

public class Car : PropertyChangedBase
{
    public Manufacturer Manufacturer { get; set; }
}

public class Manufacturer : PropertyChangedBase
{
    public String Name { get; set; }
}

Есть ли способ «всплыть» у NotifyOfPropertyChange для объектов? Я думаю, что другой способ сделать это с помощью агрегатора событий, но я не очень много знаю об этом.

1 Ответ

1 голос
/ 14 мая 2019

Вы можете обработать событие Manufacturer PropertyChanged в вашей модели представления:

private Car _myCar;
public Car MyCar
{
    get { return _myCar; }
    set
    {
        if (_myCar != null && _myCar.Manufacturer != null)
            _myCar.Manufacturer.PropertyChanged -= OnManufacturerPropertyChanged;
        _myCar = value;
        NotifyOfPropertyChange(() => CanSaveSelection);
        if (_myCar != null && _myCar.Manufacturer != null)
            _myCar.Manufacturer.PropertyChanged += OnManufacturerPropertyChanged;
    }
}

private void OnManufacturerPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    NotifyOfPropertyChange(nameof(CanSaveSelection));
}
...