C# 【WPF】之 INotifyPropertyChanged的简单封装

以下是一个简单的 INotifyPropertyChanged 封装示例:

csharp 复制代码
using System.ComponentModel;
c#兼职Q群:741058172
public class ObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
  protected void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    protected bool SetProperty<T>(ref T storage, T value, string propertyName = null)
    {
        if (Equals(storage, value))
        {
            return false;
        }

        storage = value;
        RaisePropertyChanged(propertyName);
        return true;
    }
}

使用这个封装,你可以在你的 ViewModel 类中继承 ObservableObject 类,以获得 INotifyPropertyChanged 的支持。你只需要在定义属性时使用 SetProperty 方法来设置属性,如下所示:

csharp 复制代码
private string _name;
public string Name
{
    get => _name;
    set => SetProperty(ref _name, value, nameof(Name));
}

这会自动触发 PropertyChanged 事件并通知视图更新。

如果UI界面属性的值是你自身属性名称,那么可以再简化下:

csharp 复制代码
public class NotifyPropertyChangedBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void RaisePropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
csharp 复制代码
  public class  ClassA:NotifyPropertyChangedBase
    {
        private int myVar;

        public int MyProperty
        {
            get { return myVar; }
            set
            {
                if (myVar != value)
                {
                    myVar = value;
                    RaisePropertyChanged();//注意这里可以省略属性名称
                }
            }
        }
        
    }

参考

相关推荐
张人玉16 小时前
C#WPF UI路由事件:事件冒泡与隧道机制
ui·c#·wpf
Aevget20 小时前
DevExpress WPF v25.2新功能预览 - 支持将JetBrains Rider与报表设计器集成
.net·wpf·界面控件·devexpress·ui开发
Aevget1 天前
界面控件DevExpress WPF v25.1新版亮点:AI功能的全面升级
c#·.net·wpf·界面控件·devexpress·ui开发
beyond谚语2 天前
第一章 WPF概述
wpf
necessary6533 天前
从工行“余额归零”事件看CAP定理:当金融系统在一致性与可用性之间做出选择
分布式·金融·wpf·可用性测试
棉晗榜3 天前
WPF隐藏控件后,怎么让其上部的控件空间自动撑高
wpf
壹佰大多4 天前
【Redisson分布式锁源码分析-3】
数据结构·分布式·mysql·spring·spring cloud·wpf·lua
LateFrames4 天前
以小白视角尝试 WPF / WinUI3 / MAUI / MAUI Blazor 构建 Windows 桌面程序
windows·wpf·maui·mauiblazor·winui3
偶尔的鼠标人5 天前
Avalonia/WPF 打开子窗口,并且跨页面传值
c#·wpf·mvvm·avalonia
玖笙&5 天前
✨WPF编程进阶【6.1】:图形原则(附源码)
c++·c#·wpf·visual studio