Документация по Avalonia UI
< Все темы
Печать

Привязка к командам

Элементы управления, выполняющие действие, например 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;
        }
    }
}

Примеры

примеры команд

Оглавление