首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于INotifyPropertyChanged

关于INotifyPropertyChanged
EN

Stack Overflow用户
提问于 2011-02-10 20:44:10
回答 3查看 324关注 0票数 0

我从来没有和INotifyPropertyChanged合作过。我正在读一篇文章,从中我找到了与INotifyPropertyChanged相关的代码。

代码语言:javascript
复制
public class ContactModel : INotifyPropertyChanged
{
    private string _firstName;

    public string FirstName
    {
        get { return _firstName; }
        set
        {
            _firstName = value;
            RaisePropertyChanged("FirstName");
            RaisePropertyChanged("FullName");
        }
    }

    private string _lastName;

    public string LastName
    {
        get { return _lastName; }
        set
        {
            _lastName = value;
            RaisePropertyChanged("LastName");
            RaisePropertyChanged("FullName");
        }
    }

    public string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }



    protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public override bool Equals(object obj)
    {
        return obj is ContactModel && ((ContactModel) obj).FullName.Equals(FullName);
    }

    public override int GetHashCode()
    {
        return FullName.GetHashCode();
    }
}

从上面的代码中我发现RaisePropertyChanged("FirstName");总是从属性设置器中调用。为什么需要调用RaisePropertyChanged。我在谷歌上搜索很好的解释,但我没有找到任何好的链接。所以如果有人解释为什么RaisePropertyChanged需要从setter调用,请解释一下。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-10 20:46:04

因为WPF注册到PropertyChanged事件,这将使绑定工作,即,您更改属性和文本框文本更改。

事件引发模式也是一个标准的模式:事件是通过一个受保护的方法引发的,这样子类就可以关闭它/或者改变行为。

实际上,我在我的视图模型上有更多关于验证名称的信息-最初是由Josh Smith编写的:

代码语言:javascript
复制
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {

        VerifyPropertyName(propertyName);

        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    protected void OnPropertyChanged(object sender, string propertyName)
    {
        PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
    }

    public void VerifyPropertyName(string propertyName)
    {

        if (TypeDescriptor.GetProperties(this)[propertyName] == null)
        {
            throw new Exception("Invalid property name: " + propertyName);
        }
    }
票数 3
EN

Stack Overflow用户

发布于 2011-02-10 20:47:47

您应该在属性设置器中检查属性是否实际更改,然后通过引发事件,您可以通知您的属性已经更改了

代码语言:javascript
复制
        set
        {
            if (lastname != value)
            {
               _lastName = value;
               RaisePropertyChanged("LastName");
               RaisePropertyChanged("FullName");
            }
        }

然后,任何订阅了PropertyChanged事件的类都将被通知该属性已更改,以便它们可以更新其绑定。

票数 2
EN

Stack Overflow用户

发布于 2011-02-10 20:47:57

这是为了让所有订阅收件人都收到一条消息,说明属性已更改,因此他们应该相应地更新它们的值。例如,网格将更改文本。

他们更新FullName属性的原因也是因为First/Last name属性直接影响person的FullName,因此绑定应该反映这些值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4957235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档