在Avalonia中,Button绑定命令的核心是通过
Command属性连接ViewModel中的
ICommand实现,配合
CommandParameter灵活传参。不需要写后台代码,纯XAML + ViewModel即可完成响应式交互。
基础命令绑定(最常用)
这是90%场景下的写法:按钮点击触发ViewModel中定义的命令。
XAML中直接绑定:<button content="保存" command="{Binding SaveCommand}"></button>
ViewModel中需暴露一个ICommand类型的属性(推荐用
RelayCommand或
AsyncRelayCommand) 确保
DataContext已正确设置为对应ViewModel(如
x:DataType="vm:MainWindowViewModel"或代码中赋值)
传参的4种典型方式
命令执行时常需携带上下文数据,Avalonia支持多种
CommandParameter绑定模式: 固定值:
CommandParameter="确认删除"绑定当前DataContext属性:
CommandParameter="{Binding UserName}"
绑定当前控件自身属性:CommandParameter="{Binding Content, RelativeSource={RelativeSource Self}}"
绑定数据项(如DataGrid/ListBox内):CommandParameter="{Binding}"(传整行对象),或配合RelativeSource向上找父级DataContext:
Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}"
启用/禁用状态控制(CanExecute)
按钮是否可点击,由命令的
CanExecute逻辑决定,不是靠
IsEnabled硬设。 实现
RelayCommand时传入
canExecute函数,例如:
new RelayCommand(DoSave, () => !string.IsNullOrEmpty(Title))当依赖属性变化时,需手动通知重算(如用
ObservableObject或
[Reactive]特性),再调用
command.RaiseCanExecuteChanged()Avalonia会自动监听
CanExecuteChanged事件并刷新按钮状态
事件转命令(非Click场景)
想让Loaded、KeyDown、SelectionChanged等事件也走命令流?用Behavior机制。
安装Xaml.Behaviors或
Xaml.Behaviors.InteractionsNuGet包 XAML中这样写:
Loaded事件处理更符合MVVM,且支持传参(
CommandParameter同样可用)
基本上就这些。命令绑定本身不复杂,但容易忽略
CanExecute通知和
RelativeSource作用域问题。用对了,UI和逻辑就能真正解耦。
