wpf 当满足条件时,阻止从OnClick执行按钮命令

rryofs0p  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(287)

我有一个RoutedUI命令,它绑定为按钮和OnClick事件的命令属性。每当我评估OnClick的某些条件时,我都想阻止命令执行。我参考了这篇文章,但没有太大帮助Prevent command execution。一个快速修复方法是获取按钮的发送者,并将其命令设置为空。但我想知道是否有其他方法。请帮助。

<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.
}
        }
daupos2t

daupos2t1#

假设你的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);
}

更多细节请访问我的blog post

pod7payv

pod7payv2#

这个简单的按钮扩展可能对某些人有用。
按钮单击时首先调用ConfirmationClick事件,如果在其回调函数e.IsConfirmed中设置为true,则调用经典的单击事件并执行命令。
由于命令绑定,您将button.IsEnabled属性绑定到command.CanExecute。
一个月一个月一个月一个月一个月一个月一个月一个月一个月二个月一个月

相关问题