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