Я не предлагаю называть реализующий класс Command
, поскольку вы можете столкнуться с конфликтом имен с некоторыми встроенными классами.
Ближайший к вашему коду попытки:
public ICommand MyCommand => new Command(parameter => { MyVoid(); });
или то же самое в синтаксисе "блока"
public ICommand MyCommand
{
get
{
return new Command(parameter => { MyVoid(); });
}
}
Но это неправильный подход, поскольку он будет создавать новый экземпляр Command
при каждом вызове команды. Дайте сборщику мусора как можно меньше работы. Примеры правильных способов сделать это вы можете найти ниже.
Вы разрабатываете другой велосипед. :) Смотрите здесь .
Вот копия-вставка из моего проекта. Это точно так же, как в приведенной выше ссылке.
public class RelayCommand : ICommand
{
private readonly Action<object> _execute;
private readonly Func<object, bool> _canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);
public void Execute(object parameter) => _execute(parameter);
}
И использование
<Button Contecnt="Click me!" Command="{Binding MyCommand}"/>
private ICommand _myCommand;
public ICommand MyCommand => _myCommand ?? (_myCommand = new RelayCommand(parameter =>
{
// do here the execution
}));
И с parameter
(Binding
для CommandParameter
также доступно)
<Button Contecnt="Click me!" Command="{Binding MyCommand}" CommandParameter="test value"/>
public ICommand MyCommand => _myCommand ?? (_myCommand = new RelayCommand(parameter =>
{
if (parameter is string p && p == "test value")
{
// do here the execution
}
}));
И, наконец, использование необязательного CanExecute
public ICommand MyCommand => _myCommand ?? (_myCommand = new RelayCommand(parameter =>
{
// do here the execution
// don't put the same condition as in CanExecute here,
// it was already checked before execution has entered this block
},
parameter => (x > y) && (a + b > c) // any condition or just return a bool
));
, если CanExecute
возвращает false
, команда не будет выполнена и Button
или MenuItem
становится автоматически отключенным. Просто проверь это.