MAUI数据绑定核心是可通知变化的数据源、BindingContext指定数据源、控件用{Binding xxx}声明绑定属性;推荐继承ObservableObject并用SetProperty实现INotifyPropertyChanged,BindingContext需在InitializeComponent()后设置,绑定表达式支持StringFormat和Mode=TwoWay。

MAUI 数据绑定核心就三点:有可通知变化的数据源、页面知道该用谁当数据源(BindingContext)、控件写清楚要绑哪个属性({Binding xxx})。不复杂但容易忽略细节。
准备一个会“说话”的 ViewModel
数据源必须能主动告诉界面“我变了”,否则界面永远卡在旧值。推荐继承 ObservableObject(来自 CommunityToolkit.Mvvm),它自动帮你处理 INotifyPropertyChanged:
- 新建 ViewModels/MainPageViewModel.cs
- 定义属性时用 SetProperty,不是直接赋值
- 例如:
private string _title = "欢迎"; public string Title { get => _title; set => SetProperty(ref _title, value); }
让页面认得这个 ViewModel
在页面的后台代码(MainPage.xaml.cs)里,把 ViewModel 实例设为 BindingContext:
public MainPage() { InitializeComponent(); BindingContext = new MainPageViewModel(); }- 也可以在 XAML 里设:
(需先定义静态实例) - BindingContext 会向下继承——设在 StackLayout 上,它里面所有子控件都能用
在 XAML 里写绑定表达式
控件属性值写成 {Binding 属性名},系统自动找 BindingContext 里的对应属性:
-
→ 显示 ViewModel 中的 Title 值 - 支持格式化:
Text="{Binding Value, StringFormat='当前值:{0:F1}'}" - 需要双向同步(比如输入框改完立刻更新 ViewModel)加
Mode=TwoWay:
常见问题快速避坑
刚上手容易卡在这几个地方:
- 属性没变?→ 检查 ViewModel 是否真继承了 ObservableObject 或手动触发 PropertyChanged
- 绑定没生效?→ 确认 BindingContext 设置时机(不能晚于 InitializeComponent()),且控件属性本身是可绑定属性(如 Label.Text 是,但自定义普通 C# 属性不行)
- 想绑多个控件到同一个 Slider?→ 用
{x:Reference slider}直接指定源,不用依赖 BindingContext:Text="{Binding Source={x:Reference slider}, Path=Value}"
基本上就这些。跑通一次单向绑定,再加 Mode=TwoWay 和简单验证,你就已经踩进 MVVM 的正门了。










