【问题标题】:How INotifyPropertyChanged's PropertyChanged event get assigned?如何分配 INotifyPropertyChanged 的​​ PropertyChanged 事件?
【发布时间】:2011-11-18 08:38:11
【问题描述】:

我有以下代码,它工作正常。

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));
        }           
    } 
}

当我在MainWindow的构造函数中创建“person”对象时,它会为person的“Name”属性赋值,此时PropertyChanged事件为NULL

如果在 Button_Click 事件中分配了相同的“person”类属性“Name”,则“PropertyChanged”事件为NOT NULL并且它指向 OnPropertyChanged。

我的问题是如何将“PropertyChanged”事件分配给 OnPropertyChanged 方法?

提前致谢。

【问题讨论】:

  • 你真的应该将你的 onpropertychanged 设置为 var handler=PropertyChanged; if (null!=handler) handler(this,new PropertyChangedEventArgs(strPropertyName) 这将帮助你避免竞争条件

标签: wpf data-binding interface inotifypropertychanged


【解决方案1】:

当您将对象设置为DataContext 时,WPF 数据绑定基础结构将添加一个PropertyChanged 处理程序,以便检测您的属性的更改。
您可以通过setting a breakpoint 观看此情况。

它指向的 OnPropertyChanged 方法是一个内部 WPF 方法,您可以通过检查委托的 Target 属性看到。

【讨论】:

    【解决方案2】:

    在订阅某些内容之前,该事件将为空。当按钮点击事件发生时,它已经有了一个订阅者(通过数据绑定系统)。

    【讨论】:

    • 感谢您的回答,但它与 SLaks 的回答签约。我很困惑哪个是正确的?
    • @Syed:他没有反驳我;他只是提供较少的细节。在 WPF 订阅事件之前(当您绑定到模型时),它是 null
    • 另一种说法是我的回答更简洁。 :) 开个玩笑,SLaks 的回答解释得更好。
    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2016-04-17
    • 2015-09-24
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多