Привязка к командам
Элементы управления, выполняющие действие, например Button, имеют свойство Command
, которое можно привязать к ICommand. При активации элемента управления (например, при нажатии кнопки) будет вызван метод ICommand.Execute
.
Хорошую реализацию ICommand
можно найти в ReactiveCommand ReactiveUI. Если вы создали свое приложение, используя шаблон приложения Avalonia MVVM, то он будет доступен по умолчанию. См. документацию ReactiveUI для получения дополнительной информации.
Пример:
namespace Example { public class MainWindowViewModel : ViewModelBase { public MainWindowViewModel() { DoTheThing = ReactiveCommand.Create(RunTheThing); } public ReactiveCommand<Unit, Unit> DoTheThing { get; } void RunTheThing() { // Code for executing the command here. } } }
<Window xmlns="https://github.com/avaloniaui"> <Button Command="{Binding DoTheThing}">Do the thing!</Button> </Window>
CommandParameter
Вы также можете передать параметр команде с помощью свойства CommandParameter
:
namespace Example { public class MainWindowViewModel : ViewModelBase { public MainWindowViewModel() { DoTheThing = ReactiveCommand.Create<string>(RunTheThing); } public ReactiveCommand<string, Unit> DoTheThing { get; } void RunTheThing(string parameter) { // Code for executing the command here. } } }
<Window xmlns="https://github.com/avaloniaui"> <Button Command="{Binding DoTheThing}" CommandParameter="Hello World">Do the thing!</Button> </Window>
Обратите внимание, что для CommandParameter
не выполняется преобразование типов, поэтому, если вам нужно, чтобы ваш параметр типа был чем-то помимо string
, вы должны предоставить объект этого типа в XAML. Например, чтобы передать параметр int
, вы можете использовать:
<Window xmlns="https://github.com/avaloniaui" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <Button Command="{Binding DoTheThing}"> <Button.CommandParameter> <sys:Int32>42</sys:Int32> </Button.CommandParameter> Do the thing! </Button> </Window>
Как и любое другое свойство, CommandParameter
также может быть привязан.
Привязка к методам
ICommand.Execute
Иногда вы просто хотите вызвать метод при нажатии кнопки без церемонии создания команды. Вы тоже можете это сделать!
namespace Example { public class MainWindowViewModel : ViewModelBase { public void RunTheThing(string parameter) { // Code for executing the command here. } } }
<Window xmlns="https://github.com/avaloniaui"> <Button Command="{Binding RunTheThing}" CommandParameter="Hello World">Do the thing!</Button> </Window>
ICommand.CanExecute
Если вам нужно, чтобы выполнение зависело от CommandParameter или вашего свойства ViewModel, вы можете определить именованный метод, образованный префиксом «Can» и именем вашего метода выполнения; метод примет параметр объекта, который является CommandParameter, и вернет логическое значение, которое определяет, является ли метод исполняемым.
namespace Example { public class MainWindowViewModel : ViewModelBase { public void RunTheThing(string parameter) { // Code for executing the command here. } bool CanRunTheThing(/* CommandParameter */object parameter) { return parameter != null; } } }
Триггер ICommand.CanExecute
если вы хотите инициировать CanExecute из ViewModel, вы должны декорировать его одним или несколькими атрибутами DependsOn, где propertyName — это имя свойства, которое активирует метод CanExecute при изменении его значения.
namespace Example { public class MainWindowViewModel : ViewModelBase { bool _isTheThingEnabled = true; bool IsTheThingEnabled { get { return _isTheThingEnabled; } set { if(value == _isTheThingEnabled) return; _isTheThingEnabled = value; PropertyChanged? .Invoke(this, new PropertyChangedEventArgs(nameof(IsTheThingEnabled))); } } public void RunTheThing(string parameter) { // Code for executing the command here. } [DependsOn(nameof(IsTheThingEnabled))] bool CanRunTheThing(/* CommandParameter */object parameter) { return IsTheThingEnabled && parameter != null; } } }