属性更改时不调用按钮命令 CanExecute

2024-01-03

我有一个带有文本框和按钮的表单。

当该文本框的值更改时,按钮命令不会调用其命令的 CanExecute 方法。

命令参数已设置但似乎没有更改。 加载窗口后,该按钮保持禁用状态。

<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="Save" Command="{Binding SaveChangesCommand}" CommandParameter="{Binding Name}" />

我知道绑定正在工作,因为我创建了一个接收目标绑定并在绑定更改时引发 CanExecute 的行为。

通过此行为,可以正常调用 CanExecute。

<Button Content="Save" Command="{Binding SaveChangesCommand}">
    <i:Interaction.Behaviors>
        <behaviors:CallCommandCanExecuteWhenBindingChange Target="{Binding Name}" />
    </i:Interaction.Behaviors>
</Button>

视图模型:

public class EditViewModel : INotifyPropertyChanged
{
    private string _name;

    public EditViewModel()
    {
        SaveChangesCommand = new DelegateCommand(p => SaveChanges(), p => CanSaveChanges());
    }

    public string Name
    {
        get { return _name; }
        set
        {
            if (value == _name) return;
            _name = value;
            OnPropertyChanged();
        }
    }

    public DelegateCommand SaveChangesCommand { get; private set; }

    private void SaveChanges()
    {
    }
    private bool CanSaveChanges()
    {
        return !string.IsNullOrWhiteSpace(Name);
    }
}

委托命令:

public interface IBaseCommand : ICommand
{
    void OnCanExecuteChanged();
}

public class DelegateCommand : IBaseCommand
{
    private readonly Action<object> _execute;
    private readonly Func<object, bool> _canExecute;

    public DelegateCommand(Action<object> execute, Func<object, bool> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter)
    {
        return _canExecute(parameter);
    }
    public void Execute(object parameter)
    {
        _execute(parameter);
        OnCanExecuteChanged();
    }

    public void OnCanExecuteChanged()
    {
        var handler = CanExecuteChanged;
        if (handler != null)
            handler(this, EventArgs.Empty);
    }
}

CallCommandCanExecuteWhenBindingChange:

public class CallCommandCanExecuteWhenBindingChange : Behavior<FrameworkElement>
{
    public static readonly DependencyProperty<CallCommandCanExecuteWhenBindingChange, object> TargetProperty;
    private ICommandBase _command;

    static CallCommandCanExecuteWhenBindingChange()
    {
        var dependency = new DependencyRegistry<CallCommandCanExecuteWhenBindingChange>();

        TargetProperty = dependency.Register(b => b.Target, s => s.OnTargetChange());
    }

    public object Target
    {
        get { return TargetProperty.Get(this); }
        set { TargetProperty.Set(this, value); }
    }

    private void OnTargetChange()
    {
        if (_command == null && AssociatedObject != null)
        {
            var field = AssociatedObject.GetType().GetProperty("Command");
            _command = (IBaseCommand)field.GetValue(AssociatedObject);
        }

        if (_command != null)
            _command.OnCanExecuteChanged();
    }
}

有谁知道为什么按钮不调用 CanExecute?


In your DelegateCommand执行CanExecuteChanged应该添加/删除到CommandManager.RequerySuggested https://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.requerysuggested(v=vs.110).aspx event

当 CommandManager 检测到可能改变命令执行能力的条件时发生。

将其更改为

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

属性更改时不调用按钮命令 CanExecute 的相关文章

随机推荐

  • Objective-C 和 Core Data 中的正则表达式

    有在 Objective C 中使用正则表达式的指南吗 具体要在 Reg Ex 中输入什么内容 核心数据属性中的字段 特别是 如何将输入限制为仅限一定数量的数字 字母以及英国邮政编码 Thanks 根据 Apple 文档 NSPredica
  • 使用 jquery 模板的多维数组

    我有以下 JavaScript 对象 var arr id 1 name one id 2 name two id 3 name three id 4 name four id 5 name five id 6 name six I m t
  • 在 Google 电子表格中导入 XML 并返回 Google 搜索结果

    我正在尝试使用以下命令将 Google 搜索结果上传到我的 Google 电子表格中importxml以前有效的代码不再有效了 我有 IMPORTXML https www google com search q site query nu
  • 在 hibernate 中检索单个字段而不是整个 pojo

    我对休眠有一些疑问 表 Employee Master 身份证号 名称 varchar 工资长 POJO EmployeeMaster java public class EmployeeMaster private int id priv
  • 从 jQuery 调用 Web 服务

    我正在尝试使用 jQuery 来使用我的 Web 服务 并且基本上只需要 Web 服务来调用函数即可 我在 NET 中使用的代码是这样的 ServiceContract Namespace http Sinvise Service publ
  • 对角线移动使玩家走得更快

    我有这个简单的移动脚本 if x gt 0 if key pygame K a or key pygame K LEFT rect player move ip 1 speed 0 if x lt SCREEN WIDTH 110 if k
  • 保存禁用字段

    在我的 edit ctp 中 我有一个不需要用户更改的选择框 所以我把array disabled gt true 但是这个字段不会出现 pr this gt data 并在保存时显示错误 有什么选择可以解决这个问题 如果您知道数据的值 则
  • Python Pandas Drop Duplicates 保持倒数第二

    选择 pandas 数据框中每个重复集的倒数第二个的最有效方法是什么 例如我基本上想做这个操作 df df drop duplicates Person Question take last True 但是这个 df df drop dup
  • 如何在 Clojure 中的嵌套数组映射中查找键到值的路径?

    假设我有 def a map foo bar biz baz qux 我如何找到给定值 qux 的键路径 这样 get in a map
  • gcc 4.5 特有的 C++ 数组创建问题

    以下代码适用于 gcc 2 9 至 4 4 版本 但不适用于 4 5 版本 struct Pass int main void Pass passes new Pass 10 gcc 4 5 的具体错误消息是 prob cc In func
  • 如何保留 int 变量的前导零?

    下面是一段代码 是功能性解密和加密程序的一部分 while checkvar lt maxvar is set to lt as maxvar is 1 to high for the index of var output append
  • 正则表达式阻止 nginx 中的 url

    我想阻止访问末尾有多余字符的网址 例如 我希望 nginx 阻止请求https www example com url pattern amp extra chars more extra 但希望它允许https www example c
  • 获取android中的账户列表

    我正在开发一个应用程序 我需要在其中查看用户手机中的帐户列表 我已经执行了这段代码 它似乎工作得很好 我面临的唯一问题是我想要获取帐户列表而不仅仅是一个帐户 那么如何实现这一目标呢 我很确定需要一个列表视图 但我没有得到任何关于如何在这里使
  • 移动Web应用程序的服务器端架构

    在我开发过的大多数桌面 Web 应用程序中 您都需要一个服务器端 Web 框架 服务器端 Web 框架 Struts Spring MVC 等 具有某种用于处理请求的控制器 然后是用于生成动态内容的模板引擎 Velocity JSP 等 现
  • Oracle 10G XE 的 JDBC 驱动程序

    我已经安装了Oracle 10G XE 我想使用 JDBC 连接到它 我应该使用哪个驱动程序以及从哪里下载它 谢谢 在安装了服务器的机器上 Oracle JDBC 驱动程序位于ORACLE HOME jdbc lib 就放ojdbc14 j
  • 如何暂停用js和html5制作的简单画布游戏?

    在遵循 YouTube 上的一些简单教程后 我创建了一个简单的贪吃蛇游戏 问题是游戏没有暂停功能 例如 当按 P 时 游戏应该暂停 恢复 并且当蛇碰到画布边界时 游戏会自行重新启动 但这是另一个问题 这是我拥有的游戏的完整代码 https
  • 函数参数的 JavaScript 执行上下文

    function Apple this name apple function Orange this name orange this apple new Apple this apple onCalled function alert
  • 如何访问nestjs服务器上上传的图像

    我有一个 Nestjs 服务器 并且已经上传了图像 但是当我尝试访问这些图像时 它们是一堆无法解释为图像的东西 我还尝试将它们转换为 blob 然后将其转换为 objectURL 然后将其设置为 img 标签的 src 但这也不起作用 上传
  • Git 推送失败。错误:RPC 失败;卷曲 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 60

    当我尝试将我的代码推送到bitbucket 我在终端中收到此错误 LibreSSL SSL read SSL ERROR SYSCALL errno 60 stopped the pause stream Closing connectio
  • 属性更改时不调用按钮命令 CanExecute

    我有一个带有文本框和按钮的表单 当该文本框的值更改时 按钮命令不会调用其命令的 CanExecute 方法 命令参数已设置但似乎没有更改 加载窗口后 该按钮保持禁用状态