c# - OnPropertyChanged() 与 PropertyChanged 事件?

标签 c# wpf mvvm

考虑这个例子。在我的 View 模型中,我有两个属性: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);
        }
    }
}

最佳答案

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

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

但是,实际上,只需使用类似 PropertyChanged.Fody 的内容即可并让它为您处理。请注意,它将执行第二个操作。

关于c# - OnPropertyChanged() 与 PropertyChanged 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16921283/

相关文章:

c# - 如何在 View 模型中调用异步方法

c# - 绑定(bind)到通用属性

c# - 使用 C# (Windows 8) 产生问题的静态变量

c# - WPF DynamicDataDisplay 模板轴标签与基于值的图标图像

c# - 输入数据时希望文本框清空

silverlight - 如何在 MVVM 应用程序中实现撤消/重做?

c# - 我如何才能将私有(private)变量的访问权限授予另一个类而不是程序员?

c# - Unity Networking : Unity crashes when I call the NetworkManager. singleton.StopClient() 函数

c# - 如何处理 WPF 中多个相似按钮的点击事件?

c# - 使用 Entity Framework 实现 MVVM 模式 - 添加删除