在Avalonia中使用Behaviors,核心是借助
Avalonia.Xaml.Behaviors库,把UI事件(如点击、加载、焦点变化)与ViewModel中的命令解耦绑定,避免后台代码写逻辑,真正践行MVVM。
安装和引入命名空间
先通过NuGet安装最新稳定版:
Install-Package Avalonia.Xaml.Behaviors -Version 11.1.0.4
然后在XAML顶部声明两个关键命名空间:
xmlns:interactivity="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"
xmlns:behaviors="clr-namespace:Avalonia.Xaml.Behaviors;assembly=Avalonia.Xaml.Behaviors"
常用事件触发绑定
比如按钮点击执行命令:
<Button Content="保存">
<interactivity:Interaction.Behaviors>
<behaviors:EventTriggerBehavior EventName="Click">
<behaviors:InvokeCommandAction Command="{Binding SaveCommand}" />
</behaviors:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</Button>支持的常见事件名包括:Click、Loaded、Unloaded、PointerPressed、PointerReleased、LostFocus等。
多个事件可并列写在同一控件内,例如同时监听按下和松开:
<pointerpressedeventtrigger> → DownCommand</pointerpressedeventtrigger>
<pointerreleasedeventtrigger> → UpCommand</pointerreleasedeventtrigger>
页面或控件加载时自动执行
适合初始化数据、设置状态等场景:
<Grid>
<interactivity:Interaction.Behaviors>
<behaviors:LoadedTrigger>
<behaviors:InvokeCommandAction Command="{Binding LoadCommand}" />
</behaviors:LoadedTrigger>
</interactivity:Interaction.Behaviors>
</Grid>注意:
LoadedTrigger是专用行为,比用
EventTriggerBehavior EventName="Loaded"更语义清晰,也更可靠(尤其对动态内容)。
自定义行为(进阶但实用)
当内置行为不够用时,可继承
Behavior<t></t>写轻量逻辑。例如让 TextBox 在
IsVisible=true时自动聚焦并全选:
public class FocusOnVisibleBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject?.PropertyChanged += OnPropertyChanged;
}
<pre class='brush:php;toolbar:false;'>private void OnPropertyChanged(object sender, AvaloniaPropertyChangedEventArgs e)
{
if (e.Property == Visual.IsVisibleProperty && AssociatedObject?.IsVisible == true)
{
AssociatedObject.Focus();
AssociatedObject.SelectAll();
}
}
protected override void OnDetaching() =>
AssociatedObject?.PropertyChanged -= OnPropertyChanged;}
XAML中直接引用:
<TextBox local:FocusOnVisibleBehavior.Attached="True" />
不复杂但容易忽略:行为只在控件生命周期内有效,确保 ViewModel 中的命令是
ICommand类型(推荐用
[RelayCommand]),且未被GC提前回收。
