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 里设:<contentpage bindingcontext="{x:Static local:MainPageViewModel.Default}"></contentpage>(需先定义静态实例)
BindingContext 会向下继承——设在 StackLayout 上,它里面所有子控件都能用
在 XAML 里写绑定表达式
控件属性值写成 {Binding 属性名},系统自动找 BindingContext 里的对应属性:
<label text="{Binding Title}"></label> → 显示 ViewModel 中的 Title 值
支持格式化:Text="{Binding Value, StringFormat='当前值:{0:F1}'}"
需要双向同步(比如输入框改完立刻更新 ViewModel)加 Mode=TwoWay:
<entry text="{Binding Name, Mode=TwoWay}"></entry>
常见问题快速避坑
刚上手容易卡在这几个地方:
属性没变?→ 检查 ViewModel 是否真继承了 ObservableObject 或手动触发 PropertyChanged 绑定没生效?→ 确认 BindingContext 设置时机(不能晚于 InitializeComponent()),且控件属性本身是可绑定属性(如 Label.Text 是,但自定义普通 C# 属性不行) 想绑多个控件到同一个 Slider?→ 用{x:Reference slider} 直接指定源,不用依赖 BindingContext:Text="{Binding Source={x:Reference slider}, Path=Value}"
基本上就这些。跑通一次单向绑定,再加 Mode=TwoWay 和简单验证,你就已经踩进 MVVM 的正门了。
