Команда WPF - вызывается из Window и UserControl, те же обработчики - PullRequest
2 голосов
/ 07 сентября 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

На мой взгляд, лучшее, что вы можете сделать, это написать свою собственную Команду, потому что, как вы сказали, вы можете повторно использовать ее в разных элементах управления и 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}" />

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

0 голосов
/ 07 сентября 2010

Тогда вы можете попробовать DelegateCommand или RelayCommand

...