MAUI Trigger 的核心作用是:在满足特定条件时,自动改变控件的外观或行为,无需写后台代码。它用声明式 XAML 实现动态样式响应,适合处理焦点、点击、数据变化等常见交互场景。
属性触发器(最常用)
监听控件自身某个属性的变化,比如 IsFocused、IsPressed、IsEnabled 等。只要值匹配设定的 Value,就立即应用 Setter。
必须指定 TargetType(目标控件类型)、Property(监听属性)、Value(触发值) Setter 可写多个,一次改背景、字体、边框等 可直接放在控件内部(局部),也可放进ContentPage.Resources或
App.xaml中定义为全局样式
示例:Entry 获得焦点时背景变黄
<Entry Placeholder="输入内容">
<Entry.Triggers>
<Trigger TargetType="Entry" Property="IsFocused" Value="True">
<Setter Property="BackgroundColor" Value="Yellow" />
<Setter Property="TextColor" Value="Black" />
</Trigger>
</Entry.Triggers>
</Entry>
数据触发器(绑定驱动)
当绑定的数据源发生变化并满足条件时触发,适合根据 ViewModel 状态控制 UI。用 Binding 替代 Property 来监听。
用{Binding Path=xxx} 指向数据源属性,支持路径、转换器、相对源
不依赖控件自身属性,而是“看数据”——比如 IsLoading == true时禁用按钮 常用于状态同步:加载中显示旋转图标、验证失败高亮输入框等
示例:绑定 ViewModel 的
IsSaving属性,禁用保存按钮
<Button Text="保存" Command="{Binding SaveCommand}">
<Button.Triggers>
<DataTrigger Binding="{Binding IsSaving}" Value="True">
<Setter Property="IsEnabled" Value="False" />
<Setter Property="Text" Value="保存中..." />
</DataTrigger>
</Button.Triggers>
</Button>
事件触发器(响应用户动作)
监听控件事件(如 Clicked、TextChanged),触发后执行命令或调用方法。注意:它不直接改样式,而是配合 InvokeCommandAction 或自定义行为使用。
需搭配EventToCommandBehavior或
InvokeCommandAction才能绑定到 ViewModel 命令 原生 Trigger 不支持直接写事件处理逻辑,要靠 Behavior 补足功能 适合做“点击后弹窗”“输入满10字触发搜索”这类操作型响应
示例:Entry 输入变化时执行命令(需引用
Microsoft.Maui.Controls行为命名空间)
<Entry>
<Entry.Behaviors>
<toolkit:EventToCommandBehavior
EventName="TextChanged"
Command="{Binding TextChangedCommand}" />
</Entry.Behaviors>
</Entry>
多触发器与状态触发器(组合与语义化)
当一个动作需要多个条件同时成立,或想按语义分组管理视觉状态,就用它们。
MultiTrigger:所有Conditions必须同时为真才触发,比如 “文本长度=5 且 文本==Hello” StateTrigger 是视觉状态管理器(VSM)的基础,配合
VisualStateGroup使用,让 UI 状态更清晰——例如定义 Normal / Pressed / Disabled 三套样式 VSM 更适合复杂控件(如 Button、CollectionView.ItemTemplate),比一堆 Trigger 更易维护
示例:只有当文本为 "OK" 且长度为2时,按钮才变绿色
<Button Text="提交">
<Button.Triggers>
<MultiTrigger TargetType="Button">
<MultiTrigger.Conditions>
<PropertyCondition Property="Text" Value="OK" />
<BindingCondition Binding="{Binding Source={x:Reference self}, Path=Text.Length}" Value="2" />
</MultiTrigger.Conditions>
<Setter Property="BackgroundColor" Value="Green" />
</MultiTrigger>
</Button.Triggers>
</Button>
基本上就这些。Trigger 不复杂但容易忽略细节——比如 TargetType 写错类型、Binding 路径无效、Setter 属性名拼错,都会导致静默失效。建议从属性触发器起步,再逐步叠加数据和状态逻辑。
