假设我有这个课程(这是出于演示目的):
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
界面,但我需要create an OnIsRealPersonChanged()
method, and call it from the setter,这是我没有的。
想法?
答案 0 :(得分:1)
您必须从其他内容触发事件,例如其他属性的设置者。
您还可以订阅自己的事件并过滤更改的属性,以决定何时为IsRealPerson提升它。注意进入循环。
如果存在具有这些确切属性(FirstName,LastName,IdNumber等)的人,则
CheckPopulationRegistry()
将对数据库进行检查。
因此,当任何其他属性发生变化时,必须引发它。但这些都是简单的属性,没有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
}
答案 1 :(得分:1)
你需要这样的东西:
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;
}