MAUI 行为(Behavior)是轻量、可复用的逻辑封装方式,用来扩展控件功能而不修改控件本身。它比自定义控件更简单,比事件处理器更符合 MVVM —— 尤其适合把 UI 事件(比如
CheckedChanged、
TextChanged)转成 ViewModel 中的命令执行。
行为的核心用法:附加到控件上
行为不是继承控件,而是“附加”在已有控件上,就像给按钮加个监听器一样。典型流程是:
写一个类,继承Behavior<t></t>(
T是目标控件类型,如
Entry、
CheckBox) 重写
OnAttachedTo和
OnDetachingFrom方法,分别处理“挂载时注册事件”和“卸载时解绑事件” 在 XAML 中通过
Behaviors.Add把它加到控件里
绑定事件到命令的常用场景
比如复选框勾选后要执行 ViewModel 里的命令(带参数),而原生
CheckBox没有
Command属性。这时你可以写一个
CheckBoxCheckedChangedBehavior: 在
OnAttachedTo中订阅
CheckedChanged事件 事件触发时,检查绑定的
ICommand是否可执行,然后调用
Execute,传入
CheckBox或其绑定的数据上下文(如待办事项对象) 务必在
OnDetachingFrom中取消订阅,避免内存泄漏
XAML 中怎么写才不报错
行为必须放在控件的
Behaviors集合里,不能直接当属性用。正确写法示例:
<CheckBox Text="完成任务">
<CheckBox.Behaviors>
<local:CheckBoxCheckedChangedBehavior Command="{Binding MarkAsDoneCommand}" />
</CheckBox.Behaviors>
</CheckBox>
注意:
local是你自定义行为所在命名空间的 XML 前缀;
Command是你定义的依赖属性,类型为
ICommand,支持绑定。
替代方案:附加属性也能干这事
如果只是想快速绑定某个事件(比如
Loaded、
TextChanged)到命令,用附加属性更简洁——不用写行为类,也不用管理生命周期。例如
LoadedCommand附加属性,只要在 XAML 写一句:
<ContentPage behaviors:LoadedBehaviors.LoadedCommand="{Binding PageLoadedCommand}">
背后自动订阅
Loaded事件,并在触发时执行命令。适合一次性、轻量级绑定,代码更少,也更容易复用。
基本上就这些。行为不是必须用,但当你需要多次复用某段“控件交互逻辑”,又不想污染 ViewModel 或写一堆事件处理器时,它就很顺手。
