c# - 绑定(bind)静态命令变量变灰按钮?

标签 c# wpf mvvm icommand

继续我与静态变量和 XAML 的斗争,我无法解决使按钮变灰的命令绑定(bind)。

View 模型中的代码:

public static ICommand CancelCalender => _cancelCalender
          ?? (_cancelCalender = new CommandHandler(CancelCalender_Button, _canExecute));


public class CommandHandler : ICommand
{
    private Action _action;
    private bool _canExecute;
    public CommandHandler(Action action, bool canExecute)
    {
        _action = action;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        _action();
    }
}

引用资料,
xmlns:viewModels="clr-namespace:StaffShiftManager.ViewModels"

这些是我尝试绑定(bind)命令变量的方式:
Command="{x:Static viewModels:ViewModelBase.CancelCalender}"


Command="viewModels:ViewModelBase.CancelCalender"


Command="{Binding Source={x:Static viewModels:ViewModelBase.CancelCalender}}"

有什么我想念的吗?任何帮助将不胜感激。

最佳答案

基本上在 ICommand CanExecute()方法,这将返回命令是否启用\可以执行。

返回 false来自 CanExecute()将禁用(灰色)按钮。

现在我稍微修改了您的代码以提供 Func<bool>作为 CanExecute()处理程序。这里会发生的是每次重新查询命令执行时,它都会执行你的canExecute。方法。

public class CommandHandler : ICommand
{
    public CommandHandler(Action execute)
        :this(execute, null)
    {
    }

    public CommandHandler(Action execute, Func<bool> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException(nameof(execute));

        _executeHandler = execute;
        _canExecuteHandler = canExecute ?? (() => true);
    }


    Func<bool> _canExecuteHandler = () => true;
    Action _executeHandler;

    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter)
    {
        return _canExecuteHandler();
    }

    public void Execute(object parameter)
    {
        _executeHandler?.Invoke();
    }
}

不是 canExecute 的默认实现方法是返回 true .甚至传递一个空值 Func到构造函数仍然会导致 true。

再添加一件事,我最喜欢的命令绑定(bind)器之一(比上面更高级)正在使用 DelegateCommand .我不记得我在哪里找到了原始来源(因为我没有写它),但要先进得多。

关于c# - 绑定(bind)静态命令变量变灰按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42617541/

相关文章:

c# - 如何在 WPF 数据网格中显示相关表中的数据

c# - 在 C# 中,为什么 dictionary[0]++ 有效?

c# - BitBlt 代码不工作

C# WPF 项目引用 F# ViewModel

c# - 如何添加实现 C++ 接口(interface)的标签?

wpf - 将 TextBox IsEnabled 绑定(bind)到 VM 的属性

wpf - 如何检测 WPF DataGrid 行数据已更改?

model-view-controller - Presenter、Presentation Model、ViewModel 和 Controller 有什么区别?

c# - 错误: Could not activate JNI Handle - WorkManager implementation in Xamarin

c# - 定义环境变量