OnPropertyChanged() vs PropertyChanged event?

本文关键字:event PropertyChanged vs OnPropertyChanged | 更新日期: 2023-09-27 18:16:56

考虑这个例子。在我的视图模型中,我有两个属性,ImageHasImage。显然,HasImage依赖于Image,并且应该在Image更新时进行更新。这至少可以通过两种方式实现,如下所示。

从性能和设计两方面考虑,哪种方法最好


解决方案1

public MyViewModel()
{
    PropertyChanged += MyViewModel_PropertyChanged;
}
private void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Image")
    {
        OnPropertyChanged(() => HasImage);
    }
}
public bool HasImage
{
    get
    {
        return (Image != null);
    }
}
public BitmapSource Image
{
    get
    {
        return this.image;
    }
    set
    {
        if (this.image != value)
        {
            this.image = value;
            OnPropertyChanged(() => Image);
        }
    }
}

解决方案2

public MyViewModel()
{
}
public bool HasImage
{
    get
    {
        return (Image != null);
    }
}
public BitmapSource Image
{
    get
    {
        return this.image;
    }
    set
    {
        if (this.image != value)
        {
            this.image = value;
            OnPropertyChanged(() => Image);
            OnPropertyChanged(() => HasImage);
        }
    }
}

OnPropertyChanged() vs PropertyChanged event?

第二个方法的性能必须更好,因为您没有注册事件处理程序,也没有调用额外的方法。

就设计而言,我更经常看到第二种,这是我更喜欢的。

然而,在现实中,只需使用PropertyChanged.Fody之类的东西,让它为您处理它。注意,它将进行第二次。