Как назначается событие PropertyChanged объекта INotifyPropertyChanged? - PullRequest
6 голосов
/ 16 сентября 2011

У меня следующий код, и он работает нормально.

public partial class MainWindow : Window
{
    Person person;

    public MainWindow()
    {
        InitializeComponent();

        person = new Person { Name = "ABC" };

        this.DataContext = person;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        person.Name = "XYZ";
    }
}

class Person: INotifyPropertyChanged
{
    string name;

    public string Name
    { 
        get
        {
            return name;
        } 
        set
        {
            name = value;
            OnPropertyChanged("Name");
        } 
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string strPropertyName)
    {
        if(null != PropertyChanged)
        {
            PropertyChanged(this, 
                            new PropertyChangedEventArgs(strPropertyName));
        }           
    } 
}

Когда я создаю объект "person" в конструкторе MainWindow, он присваивает значение для свойства "Name" person, котороевремя события PropertyChanged равно NULL .

Если для события Button_Click назначено одно и то же свойство класса "person" класса Name, событие PropertyChanged равно NOT NULL и имеет значениеуказывая на OnPropertyChanged.

У меня вопрос, как событие «PropertyChanged» назначается методу OnPropertyChanged?

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 16 сентября 2011

Инфраструктура привязки данных WPF добавит обработчик PropertyChanged, когда вы установите объект как DataContext, чтобы обнаруживать изменения в ваших свойствах.
Вы можете наблюдать это, установив точку останова .

Метод OnPropertyChanged, на который он указывает, является внутренним методом WPF, как вы можете убедиться, проверив свойство Target делегата.

2 голосов
/ 16 сентября 2011

Событие будет нулевым, пока что-то не будет подписано на него. К тому времени, когда произошло событие нажатия кнопки, у него уже есть подписчик (через систему привязки данных).

...