Команда WPF - вызывается из Window и UserControl, те же обработчики

Как я могу иметь команду, которую можно вызывать как из окна, так и из пользовательского элемента управления (нажав кнопку в любом из них), которая использует одни и те же методы выполнения и может выполняться? Похоже, если у меня есть следующее в XAML моего UserControl, для этого требуется, чтобы myCommandHandler и canExecuteMyCommand были в моем классе UserControl:

<CommandBinding Command="{x:Static local:MyUserControl.MyCommand}"
                Executed="myCommandHandler"
                CanExecute="canExecuteMyCommand"/>

Затем, если я хочу использовать ту же команду в своем окне, мне снова нужны myCommandHandler и canExecuteMyCommand, определенные в классе моего окна. Как я могу определить команду так, чтобы и мой UserControl, и Window могли получить к ней доступ, но myCommandHandler и canExecuteMyCommand определены только в одном классе? Нужно ли мне создавать свой собственный класс команд вместо объявления статического поля RoutedCommand в MyUserControl?


person Sarah Vessels    schedule 07.09.2010    source источник


Ответы (2)


На мой взгляд, лучшее, что вы можете сделать, это написать свою собственную команду, потому что, как вы сказали, вы можете повторно использовать ее в разных элементах управления и Windows.

Первый подход к созданию пользовательской команды состоит в том, чтобы получить его из ICommand. Вот пример базового командного класса:

public abstract class BaseCommand : ICommand
{
    protected IMyViewModel viewModel;

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public BaseCommand(IMyViewModel viewModel)
    {
        this.viewModel = viewModel;
    }

    public abstract bool CanExecute(object parameter);
    public abstract void Execute(object parameter);
}

Чтобы использовать команду, например, при нажатии кнопки, код будет выглядеть примерно так:

<Button Command="{Binding Path=MyReuseableCommand,
                  UpdateSourceTrigger=PropertyChanged}" />

Я надеюсь, что это поможет вам выбрать правильное направление.

person Mario Pistrich    schedule 07.09.2010

Вы можете попробовать DelegateCommand или RelayCommand, затем

person Prince Ashitaka    schedule 07.09.2010