当属性在C#中只有一个getter时,如何创建属性更改事件

时间:2016-10-27 09:20:09

标签: c# events inotifypropertychanged propertychanged

假设我有这个课程(这是出于演示目的):

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,这是我没有的。

想法?

2 个答案:

答案 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;

}