Как создать событие измененного свойства, когда свойство имеет только геттер в C#

Допустим, у меня есть этот класс (который действительно для демонстрационных целей):

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string IdNumber { get; set; }

    // CheckPopulationRegistry() checks against the database if a person
    // these exact properties (FirstName, LastName, IdNumber etc.) exists.
    public bool IsRealPerson => CheckPopulationRegistry(this);
}

Я хочу получать уведомления, когда IsRealPerson изменено

Обычно я бы реализовал INotifyPropertyChanged интерфейс, но тогда мне нужно будет создать OnIsRealPersonChanged() метод, и вызвать его из сеттера, которого у меня нет.

Идеи?

2 ответа

Решение

Вам нужно что-то вроде этого:

public class Person : INotifyPropertyChanged
{
    private string firstName;
    private string lastName;

    private void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private bool CheckPopulationRegistry(Person p)
    {
        // TODO:
        return false;
    }

    public string FirstName
    {
        get { return firstName; }
        set
        {
            if (firstName != value)
            {
                firstName = value;
                OnPropertyChanged();
                OnPropertyChanged(nameof(IsRealPerson));
            }
        }
    }

    public string LastName
    {
        get { return lastName; }
        set
        {
            if (lastName != value)
            {
                lastName = value;
                OnPropertyChanged();
                OnPropertyChanged(nameof(IsRealPerson));
            }
        }
    }

    // IdNumber is omitted

    public bool IsRealPerson => CheckPopulationRegistry(this);

    public event PropertyChangedEventHandler PropertyChanged;

}

Вы должны будете инициировать событие из чего-то другого, например, из установщиков других свойств.

Вы также можете подписаться на собственное событие и отфильтровать измененные свойства, чтобы решить, когда вызывать его для IsRealPerson. Остерегайтесь идти в петле.


CheckPopulationRegistry() проверяет базу данных, существует ли человек с такими точными свойствами (FirstName, LastName, IdNumber и т. д.).

Так что это должно быть поднято, когда любое из этих других свойств изменяется. Но это все простые свойства без поддержки INPC. Это не сработает.

class Person : ViewModelBase // use a base from any MVVM framework or roll your own
{
    private string _firstName;
    public string FirstName 
    { 
       get { return _firstName; }
       set 
       { 
           _firstname = value;
           RaisePropertyChanged(nameof(FirstName));
           RaisePropertyChanged(nameof(IsRealPerson));
       }
    }

    // the same for the other properties
    // IsRealPerson can remain as is

 }
Другие вопросы по тегам