MAUI中的INotifyPropertyChanged怎么用 MVVM核心接口教程

来源:这里教程网 时间:2026-02-21 17:34:16 作者:

在 .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 中直接绑定:
<label text="{Binding Message}"></label>
需要双向同步(比如 Editor 输入回传)加
Mode=TwoWay
{Binding Message, Mode=TwoWay}

注意:集合类(如

ObservableCollection<t></t>
)本身已实现变更通知,但集合内部元素变化仍需元素自身支持
INotifyPropertyChanged

基本上就这些。不复杂,但容易忽略 OnPropertyChanged 调用或绑定上下文设置——这两处出错,绑定就静默失效。

相关推荐