INotifyPropertyChanged 是 .NET MAUI MVVM 数据绑定的必需接口,用于通知 UI 属性变更;需手动实现或通过 CommunityToolkit.Mvvm 的 ObservableObject 简化;绑定时还需设置 BindingContext 并在 XAML 中正确引用。

在 .NET MAUI 中,INotifyPropertyChanged 是 MVVM 数据绑定的基石——它让 UI 能“感知” ViewModel 属性的变化并自动刷新。不用它,绑定就只是单向静态值,改了属性,界面上啥也不会变。
为什么必须实现这个接口
MAUI 的 XAML 绑定(比如 {Binding Name})默认只监听实现了 INotifyPropertyChanged 的对象。如果 ViewModel 没触发 PropertyChanged 事件,哪怕你在代码里改了 Name = "李四",TextBlock 依然显示旧值。
这个接口定义在 System.ComponentModel 命名空间,核心就一件事:当属性值变了,主动“喊一嗓子”通知界面更新。
最简手动实现方式
新建一个 ViewModel 类,手动实现接口:
- 声明
PropertyChanged事件 - 写一个
OnPropertyChanged方法,用[CallerMemberName]自动获取属性名,避免硬编码字符串出错 - 每个可绑定属性的
set块里调用它(且仅在值真变了时才触发)
示例:
public class PersonViewModel : INotifyPropertyChanged{
private string _name;
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string? name = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
推荐用 CommunityToolkit.Mvvm 省事
手写样板代码容易漏、重复多。官方推荐的 CommunityToolkit.Mvvm 提供了 ObservableObject 基类,一行 SetProperty 就搞定通知逻辑:
- 安装 NuGet 包:
CommunityToolkit.Mvvm - ViewModel 继承
ObservableObject - 用
SetProperty(ref _field, value)替代手动判断和触发
示例:
public class MainViewModel : ObservableObject{
private string _message = "Hello";
public string Message
{
get => _message;
set => SetProperty(ref _message, value); // 自动比较 + 触发通知
}
}
别忘了绑定上下文和 XAML 写法
光有 ViewModel 不够,还得让页面“认得”它:
- 在
MainPage.xaml.cs构造函数中设置:BindingContext = new MainViewModel(); - XAML 中直接绑定:
- 需要双向同步(比如 Editor 输入回传)加
Mode=TwoWay:{Binding Message, Mode=TwoWay}
注意:集合类(如 ObservableCollection)本身已实现变更通知,但集合内部元素变化仍需元素自身支持 INotifyPropertyChanged。
基本上就这些。不复杂,但容易忽略 OnPropertyChanged 调用或绑定上下文设置——这两处出错,绑定就静默失效。










