Как создать событие измененного свойства, когда свойство имеет только геттер в 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
}