MAUI双向绑定需三要素:可通知模型(如ObservableObject)、XAML中显式声明Mode=TwoWay、正确设置BindingContext;否则默认OneWay,导致用户输入不更新模型。

MAUI 中实现双向绑定,核心是让 UI 控件和数据模型能互相自动更新:用户改输入框,模型值立刻变;代码改模型值,界面也立刻刷新。关键在三要素:绑定上下文(BindingContext)、绑定路径(Path),以及 BindingMode.TwoWay 显式声明。
1. 准备可通知的数据模型(INotifyPropertyChanged)
双向绑定要求模型能“告诉”界面自己变了。必须实现 INotifyPropertyChanged 接口,并在属性 setter 里触发 PropertyChanged 事件。
推荐用 C# 12 的 ObservableObject(MAUI 内置)简化写法:
public partial class LoginViewModel : ObservableObject
{
[ObservableProperty]
private string _username;
[ObservableProperty]
private string _password;
}
上面代码自动生成带通知逻辑的 Username 和 Password 属性,无需手写 INotifyPropertyChanged。
2. 在 XAML 中设置 TwoWay 绑定
绑定到控件时,显式指定 Mode=TwoWay。不是所有控件默认支持双向,不写会退化为单向(OneWay)。
例如绑定到 Entry 和 Switch:
注意:
• Text、IsToggled、IsChecked、SelectedItem 等属性才支持双向;
• 如果省略 Mode=TwoWay,默认是 OneWay(只响应模型变化,不反馈用户操作);
• 绑定前确保页面设置了 BindingContext,比如在代码后台:this.BindingContext = new LoginViewModel();
3. 验证绑定是否生效(调试小技巧)
常见问题:改了输入没更新模型?检查以下几点:
- ViewModel 是否继承
ObservableObject或正确实现INotifyPropertyChanged - XAML 中绑定路径是否拼写一致(大小写敏感)
- 是否漏写
Mode=TwoWay—— 尤其Entry默认是OneWay - 绑定上下文是否在页面加载完成前就已设置(建议在
OnAppearing或构造函数末尾赋值)
可在 ViewModel 属性 setter 打断点或加日志,确认用户输入后是否被触发。
4. 进阶:使用 Binding Converter 处理类型转换
如果绑定类型不匹配(如把 int 绑定到 Text),需用 IValueConverter 转换。但注意:双向绑定需要同时实现 Convert 和 ConvertBack。
例如把布尔值转成“启用/禁用”文本:
public class BoolToTextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
(bool)value ? "启用" : "禁用";
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
value?.ToString() == "启用";
}
在 XAML 中使用(记得设 Mode=TwoWay):
...
基本上就这些。重点就是:模型可通知 + XAML 显式写 Mode=TwoWay + 绑定上下文到位。不复杂但容易忽略细节。










