在 .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.MvvmViewModel 继承
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 中直接绑定:
<label text="{Binding Message}"></label>
需要双向同步(比如 Editor 输入回传)加 Mode=TwoWay:
{Binding Message, Mode=TwoWay}
注意:集合类(如
ObservableCollection<t></t>)本身已实现变更通知,但集合内部元素变化仍需元素自身支持
INotifyPropertyChanged。
基本上就这些。不复杂,但容易忽略 OnPropertyChanged 调用或绑定上下文设置——这两处出错,绑定就静默失效。
