Запретить выполнение команды кнопки из OnClick при выполнении условия - PullRequest
0 голосов
/ 18 октября 2018

У меня есть команда RoutedUI, которая связана как свойство команды для кнопки и события OnClick.Всякий раз, когда я оцениваю какое-либо условие из OnClick, я хочу предотвратить выполнение команды.Я ссылался на этот пост, но не очень помог Предотвратить выполнение команды .Одно из быстрых решений заключается в том, чтобы получить отправителя кнопки и нажать на ее команду значение null.Но я хочу знать, есть ли другой путь.Пожалуйста, помогите.

 <Button DockPanel.Dock="Right"
                        Name="StartRunButtonZ"
                        VerticalAlignment="Top"
                        Style="{StaticResource GreenGreyButtonStyle}"
                        Content="{StaticResource StartARun}"
                        Width="{StaticResource NormalEmbeddedButtonWidth}"
                        Click="StartRunButton_Click"
                        Command="{Binding StartRunCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl},AncestorLevel=2}}" 
                    />

Вот код, стоящий за

private void StartRunButton_Click(object sender, RoutedEventArgs e)
        {
         if(SomeCondition){
//Prevent the Command from executing.
}
        }

1 Ответ

0 голосов
/ 18 октября 2018

Предполагая, что ваш метод StartRun () следует шаблону async / await, затем замените реализацию ICommand следующим.Во время выполнения задачи CanExecute будет иметь значение false, что автоматически отключит кнопку.Вам не нужно смешивать команды и нажимать на обработчики событий.

public class perRelayCommandAsync : ViewModelBase, ICommand
{
    private readonly Func<Task> _execute;
    private readonly Func<bool> _canExecute;

    public perRelayCommandAsync(Func<Task> execute) : this(execute, () => true) { }

    public perRelayCommandAsync(Func<Task> execute, Func<bool> canExecute)
    {
        _execute = execute ?? throw new ArgumentNullException(nameof(execute));
        _canExecute = canExecute;
    }

    private bool _isExecuting;

    public bool IsExecuting
    {
        get => _isExecuting;
        set
        {
            if(Set(nameof(IsExecuting), ref _isExecuting, value))
                RaiseCanExecuteChanged();
        }
    }

    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter) => !IsExecuting 
                                                && (_canExecute == null || _canExecute());

    public async void Execute(object parameter)
    {
        if (!CanExecute(parameter))
            return;

        IsExecuting = true;
        try
        { 
            await _execute().ConfigureAwait(true);
        }
        finally
        {
            IsExecuting = false;
        }
    }

    public void RaiseCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}

Подробнее в моем блоге .

...