WPF - 从 UserControl 发出命令时 CanExecute 不会触发

2024-05-05

我有一个按钮条用户控件,我想在我的大多数表单上使用它。

我添加了如下命令......

    public ICommand Create
    {
        get
        {
            return buttonCreate.Command;
        }
        set
        {
            buttonCreate.Command = value;
        }
    }

我已将它们设置为依赖属性,以便我可以绑定到它们......

        public static readonly DependencyProperty CreateCommandProperty =
        DependencyProperty.Register(
        "Create",
        typeof(ICommand),
        typeof(StandardButtonStrip),
        new PropertyMetadata((ICommand)null));

然后我将我的用户控件绑定到命令......

<commoncontrols:StandardButtonStrip HorizontalAlignment="Stretch" Create="{Binding CreateCommand}" />

我正在设置命令如下......

_viewModel.CreateCommand = new DelegateCommand<object>(OnCreateCommand, CanCreate);

但尽管事实上我总是在 CanCreate 方法上返回 true,但按钮被禁用......如果我在 return true 上放置一个断点,它永远不会触发!

    public bool CanCreate(object parm)
    {
        return true;
    }

我试过这个,看看它是否会刷新绑定,但没有喜悦!

_viewModel.CreateCommand.RaiseCanExecuteChanged();

我认为问题在于用户控件以及我如何将命令作为属性传递,但不确定......


看起来,您在视图模型上有一个依赖属性。如果您确实使用 MVVM,那绝对不是正确的方法(不是因为宗教上对模式的坚持,而是因为它不是最佳方法)。

首先,你的视图模型是 DependencyObject 吗?

如果是,您应该将其降级为实现 INotifyPropertyChanged 的​​类。为什么?因为 Button 的 Command 属性本身就是 DependencyProperty(继承自 ButtonBase)并且已经支持数据绑定。

如果不是,那么它的依赖属性将不起作用,这很好,因为您首先不应该在视图模型上拥有依赖属性。

您应该做的是将视图模型作为您的控件的 DataContext (我猜您已经进行了设置)。然后将视图模型的 CreateCommand 更改为普通的 ICommand,并像这样绑定 createButton 的 Command 属性(在默认的 StandardButtonStrip 样式中)

<Button Name="createButton" HorizontalAlignment="Stretch" Command="{Binding CreateCommand}" />

这样,它仍然是可重用的,您只需要确保与用户控件关联的任何视图模型都有一个 ICommand 类型的属性 CreateCommand (并且该视图模型将默认继承到按钮控件 - 其中之一wpf 的人想出了最好的东西)。

因此,回顾一下,您应该或多或少地以相反的方式进行操作。

希望这对您有帮助,干杯。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF - 从 UserControl 发出命令时 CanExecute 不会触发 的相关文章

随机推荐

  • Facebook URL 调试:抱歉,出了点问题。我们正在尽快努力修复这个

    https developers facebook com tools debug https developers facebook com tools debug 有谁知道为什么 某些 URL 会出现此错误 而其他 URL 则不会 错误
  • 使用 python (openpyxl) 从 Excel 中删除网格线

    我正在尝试从使用 openpyxl 创建的 Excel 工作表中删除网格线 但它不起作用 我正在这样做 wb Workbook ws wb get active sheet ws show gridlines False print ws
  • setState 没有在 Dart / Flutter 中重新加载状态?

    我遵循了 Google CodeLabs 的 Flutter 教程 Part 1 https codelabs developers google com codelabs first flutter app pt1 Part 2 http
  • 当`enableProdMode()`时到底发生了什么[重复]

    这个问题在这里已经有答案了 我正在与Angular2 quick start演示使用TypeScript 一切正常 但在演示完成后 我在浏览器控制台中看到一条消息 Angular 2 正在开发模式下运行 调用enableProdMode 启
  • 模板类中的模板函数 is_same

    为什么这段代码会产生错误的输出 this type cpp include
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • SQL 与 LINQ 性能 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MATLAB 中的抗锯齿线和标记

    您好 我在 MATLAB 中有一张图像 我希望这条线是平滑的 看看从 0 4 到 0 8 的线 这太可怕了 当在图中使用 LineSmoothing on 运算符时 我得到了这个 我在线条上做得很好 但它也使标记变得平滑 而且它们太可怕了
  • 调用“DisplayManagerGlobal.getDisplayInfo()”会导致应用程序中的应用程序无响应 (ANR)

    显然 应用程序中的某些内容从不同线程 主线程和绑定器线程 调用该方法 这会导致内部 ANR 它经常发生 我不知道它发生在哪里 因为我无法在模拟器或我拥有的测试设备上重现它 该应用程序的作用 它是一个应用程序储物柜应用程序 它在应用程序覆盖层
  • Jenkins 安排代理节点可用性

    我们有许多机器希望用作 Jenkins 的代理节点 但仅限于特定的时间间隔 即不在工作时间 是否可以配置一个代理节点作为特定时间范围内构建的代理 例如 周一至周五晚上 10 点至凌晨 5 点 周六和周日全天 In the 从机配置面板 选择
  • const 或 ref 或 const ref 或 value 作为 setter 函数的参数

    恒定性 class MyClass private std string m parameter 按值传递 void MyClass SetParameter std string parameter m parameter paramet
  • 在 Windows 中使用 OpenAI API 密钥时出现问题

    我必须在自定义数据集上微调 OpenAI 模型 我已经创建了 jsonl 格式的数据集 我在 Windows 命令行上使用以下命令 set OPENAI API KEY
  • 使用 Python3 与 HDFS 交互的最佳模块是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我看到有 hdfs3 snakebite 和其他一些 哪一个支持最好且最全面 据我所知 可能性并不像人们想象的那么多 但我建议使用官方的Pyth
  • 表、TR各2个循环、PHP、HTML

    我有一个 html 表 我使用一些循环来获取一些数据 该数据以这种方式显示 tr td Data td tr next loop 但我不希望它每 2 个甚至 3 个循环关闭表行 tr 所以数据可能如下所示 tr td Data td td
  • 使用矩阵参数创建 GET 请求

    我将使用的网络服务需要矩阵参数 http tester com v1 customers lastname Jackson firstname Tim bookingreference 7Y9UIY 而不是通常的 http tester c
  • RadioButton 和 DropDownList 的 MVC 服务器端验证

    使用 ASP NET Core 2 2 Razor Pages 我正在探索将单选按钮和下拉列表绑定到页面模型 很多人都在询问客户端验证以 使其正常工作 我的问题是 当我查看这段代码时 绑定引擎是否正在执行任何服务器端检查 foreach v
  • 从 java servlet 运行长进程的最佳方法是什么?

    我想问从 java servlet 运行长进程的最佳方法是什么 我有一个网络应用程序 当客户端发出请求时 它会运行一个 servlet 该 servlet 应该从请求中获取一些参数 然后运行一个进程 这个过程可能需要很长时间 所以我需要单独
  • 使用列模数的更简洁方法

    我目前有一个人员列表 我已将其分为两列 但在完成代码后 我一直想知道是否有更有效或更干净的方法来完成同样的事情 echo table class area list tr Loop users within areas divided up
  • NSTimer 每分钟运行一次,但在第一秒运行

    我有使用 NSTimer 每分钟运行一次的经验 例如 NSTimer scheduledTimerWithTimeInterval 60 0 target self selector Selector everyMinute userInf
  • WPF - 从 UserControl 发出命令时 CanExecute 不会触发

    我有一个按钮条用户控件 我想在我的大多数表单上使用它 我添加了如下命令 public ICommand Create get return buttonCreate Command set buttonCreate Command valu