CanExecuteCommand 对性能有影响吗?

2023-11-26

使用 ICommand 对象的 CanExecuteCommand 对性能有何影响?该方法是否一遍又一遍地执行?

我需要迭代大约 200 个对象的集合,根据这些对象决定是否应启用绑定到命令的按钮? CanExecuteCommand 是否会重复执行,这会使我的应用程序变慢


The ICommand界面如下:

public interface ICommand
{
    // two methods
    bool CanExecute(object parameter);
    void Execute(object parameter);

    // one event
    event EventHandler CanExecuteChanged;
}

The CanExecuteChanged任何时候您想要表明该事件时都应该引发该事件CanExecute方法应由 WPF 检查/调用。谁实施谁ICommand应该引发该事件,并且任何需要刷新 GUI(WPF 系统)上按钮启用状态的人都应该注册并处理该事件,并且它调用CanExecute.

在约什史密斯的RelayCommand类,他使用WPF的内置CommandManager提高班级CanExecuteChanged:

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}

本质上,WPF 的CommandManager是一个监听各种路由事件的单例:KeyUpEvent、MouseUpEvent 等...然后通过提高其值来告诉每个人“嘿,发生了一些有趣的事情”RequerySuggested事件。所以如果你正在使用RelayCommand, your CanExecute每次都会被叫CommandManager认为 GUI 上发生了一些有趣的事情(即使它与您的收藏无关)。如果您有 50 个命令,则每次您键入时,它都会重新检查所有 50 个命令。所以是的,这个could是一个性能问题。然而,如果你的逻辑CanExecute方法很简单,可能不是问题。要点:不要在CanExecute method.

搭便车的替代方案CommandManager.RequerySuggested提高ICommand.CanExecuteChanged活动是推出您自己的版本RelayCommand你自己检查并加注的地方CanExecuteChanged手动,或者查看 Prism 框架的DelegateCommand类,他们不参与其中CommandManager并且你必须手动提高CanExecuteChanged事件,您可以通过创建监听器来完成PropertyChanged然后提高CanExecuteChanged在命令上。

不过我同意上面@Will 的观点。RelayCommand80% 以上的时间可能都可以正常工作,不会出现任何问题。如果您确实开始发现性能问题,那么您可以创建自己的 RelayCommand 版本或使用 PrismDelegateCommand并提高CanExecuteChanged手动。

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

CanExecuteCommand 对性能有影响吗? 的相关文章

  • WPF 列表框 + 扩展器事件

    我在列表框的 ItemTemplate 中有一个 Expander 渲染得很好 我遇到的问题是 我希望在展开和 或选择扩展器时触发 ListBox SelectionChanged 事件 MouseDown 事件似乎没有冒泡到 ListBo
  • 从视图模型调用方法的命令

    好吧 我倾向于避免使用命令 因为它们总是让我感到困惑 但我正在进行一个新项目 并且正在尝试正确构建它 并且在我看来没有任何代码隐藏 基本上我现在想做的就是连接一个按钮来触发一个命令 在我的视图模型上执行一些操作 但不知何故 如此简单的事情仍
  • 支持全方向动画的扩展器

    我的目标 是创建一个带有扩展动画的自定义扩展器 并且应该支持所有方向 我尝试过的 我在以下人员的帮助下实施了一个解决方案this http www codeproject com Articles 248112 Templating WPF
  • 使用自定义视觉效果创建无边框窗户

    我想使用 WPF 创建一个看起来不像常规窗口的自定义窗口 我想要创建的窗口类似于MacOs窗口 标题居中 带有阴影效果 控件按钮位于窗口左侧 我确实创建了一个无边框窗口 但我有一些问题 1 如何在 XAML 中设置最大化 最小化和关闭按钮的
  • Visual Studio 2010 解决方案的 MSBuild 命令行执行无法引用 VS2010 SDK 来构建扩展

    Scenario 包含 VS2010 扩展的解决方案 NET 4 类库 带有 WPF UI 它在视觉工作室内部构建得很好 On the 同一台机器当我尝试通过命令行构建它时 作为构建脚本的一部分 Fails when using this
  • MVVM 在 ASP.NET MVC 4 Web 应用程序中扮演什么角色?

    当我正在阅读 ASP NET MVC 4 这本书时 我对 MVVM 感到好奇 我开始谷歌搜索 找不到任何关于使用 MVVM 开发 Web 应用程序的书籍 所以我一定在这里遗漏了一些信息 据我了解 MVVM是通过knockout js和其他框
  • 从单元测试调用时,Application.Current 为 null

    我有一个尝试从单元测试中调用的方法 该方法在现实生活中将从后台线程运行 它使用一些代码来启动 UI 线程的调用更新 使用Application Current Dispatcher BeginInvoke However Applicati
  • WPF 自定义 TabItem - 控件未显示在 Visual Studio 设计器中

    我创建了一个自定义 TabItem 其中包含 DockPanel 和 Button XAML
  • 如何在WPF中裁剪图像并保存到ImageSource中?

    我是 WPF 的新学员 我有一个问题 我有一个图像 宽度 360 高度 360 在这里 我想裁剪该图像 如下所示 0 0 到 120 120 保存到第一个 ImageSource 对象 120 0 到 240 120 保存到第二个 Imag
  • 有没有办法对 RichTextBox 的撤消历史进行分组或暂时禁用它?

    我目前正在研究 WPF 中 RichTextBox 内的表格 在 WPF 中 表格没有行和列 只有行 每行都有一定数量的单元格 当用户按下 添加列 按钮时 我的程序会向每一行添加一个新单元格 使用此方法的问题是 在用户添加一列后 如果他们按
  • 绑定未正确更新用户控件属性 MVVM

    编辑 删除旧代码 我将它放在 MainWindow xaml 上
  • wpf中的图像问题(图像不显示)

    我不明白为什么我无法在 WPF 中显示图像 也许我不小心修改了我的资源文件夹 这就是我没有显示的原因 所以我创建了一个新的 wpf 应用程序 我有这个 当我运行该程序时 我的图片显示为 为什么当我尝试在程序中执行相同的操作时 图像没有显示
  • 如何将绑定源设置为“self”/UserControl 代码隐藏

    如何设置绑定源以指向 此 UserControl CodeBehind 例如 从用户控件MarkdownEditor xaml 我想指出其中的属性MarkdownEditor xaml cs 无需设置即可执行此操作DataContext t
  • WPF:按钮单击+双击问题

    我必须处理 WPF 应用程序中按钮的单击和双击 并具有不同的反应 不幸的是 在双击时 WPF 会触发两个单击事件和一个双击事件 因此很难处理这种情况 它试图使用计时器来解决它 但没有成功 我希望你能帮助我 我们看一下代码 private v
  • Wpf DataGrid通过DataBinding隐藏完整行

    是否有可能通过数据绑定隐藏 DataGrid 行 如果我有一个具有可见性属性的 BO 或 ViewModel 项目 是否可以声明一个绑定 以便在该属性设置为不可见时该行将被隐藏 反之亦然 应该可以通过RowStyle 像这样的东西
  • WPF DataGrid 绑定到 string.Length 而不是字符串文本

    我是 WPF 的新手 并且真诚地尝试自己尽可能多地弄清楚 我已经创建了第一个 DataGrid 控件 并且尝试使用如下字符串列表填充它
  • 当应用程序未聚焦时监听按键

    我有一个应用程序 C 4 0 WPF 它是隐藏的 可以通过单击系统托盘图标或我创建的其他框架 停靠在左侧和最上面的小框架 来显示 My customer wants to add a new way to display the appli
  • 我可以将 XAML/WPF 窗口复制到第二个窗口中,例如画中画电视吗?

    我有一个带有两个 XAML WPF 窗口 派生自 NavigationWindow 的应用程序 每个窗口都包含一个父 UserControl 其中放置了所有子控件 在其中一个窗口中 我想以画中画电视的方式显示第二个窗口的内容 实际上只是父
  • 在使用实体框架的分层架构中,我应该从 BLL 返回 POCO 类吗? (需要架构指导)

    我可能读得太多了 并且遭受了一些信息超载的困扰 所以我希望得到一些明确的指导 根据我收集的信息 我可以使用 VS2010 的 T4 模板来生成不直接与 EF 绑定的 POCO 类 我会将这些放在他们自己的项目中 而我的 DAL 将有一个 O
  • MVVM 在 iOS 中的使用

    我是一名 iOS 开发人员 我对我的项目中存在大量视图控制器感到内疚 因此我一直在寻找更好的方法来构建我的项目 并遇到了 MVVM 模型 视图 视图模型 架构 我读了很多关于 iOS 的 MVVM 文章 但有几个问题 我将用一个例子来解释我

随机推荐

  • SwiftUI 控制台显示 CVDisplayLink 相关消息?

    当我运行我正在开发的基于 MacOS 的 SwiftUI 应用程序时 我在控制台上收到大量输出 例如 2021 12 08 12 40 14 439565 0000 SpDriveApp 6801 159299 0x7fe6e7830820
  • HTML如何在网页中插入动态日期

    我有一个静态网页 没有任何动态变化 然而 客户希望将日期插入到页面内的文本中 该日期将始终是当前日期加上一天 我怎么做 使用 JavaScript 并在加载时插入日期 看一下这里的工作示例 http jsfiddle net xGDvp 这
  • 被 FoldLeft 错误困惑(在 Eclipse 和 REPL 中)

    其背景非常简单 我的假设基于 Odersky 的书 Programming in Scala 2nd Edition 第 8 5 节描述了 占位符语法 我有一个 List List Boolean 即矩形位图 我试图在其中计算值 true
  • 什么是自动覆盖索引?

    使用时EXPLAIN QUERY PLAN在 SQLite 3 中 它有时会给我输出 例如 SEARCH TABLE staff AS s USING AUTOMATIC COVERING INDEX is freelancer AND s
  • 如何将图像和录制文件保存在临时目录中?

    我想将从我的应用程序中拍摄的相机照片和视频录制存储在临时目录中的单独文件夹中一段时间 当任务完成时 他们将保存到数据库中 如何将从相机和视频录制文件中拍摄的图片保存在临时目录中的单独文件夹中 您正在寻找这个来访问缓存文件夹来存储临时文件 N
  • R:ggfortify:“自动绘图不支持 prcomp 类型的对象”

    我正在尝试使用 ggfortify 来可视化我使用 prcomp 所做的 PCA 结果 示例代码 iris pca lt iris c 1 2 3 4 autoplot prcomp iris pca 错误 自动绘图不支持 prcomp 类
  • JPA Hibernate n+1 问题(Lazy 和 Eager Diff)

    我试图理解 n 1 问题 从而找到正确的解决方案 我有两个实体 公司 Entity Table name company public class Company implements Serializable private static
  • 以最小总距离连接所有点的算法

    我有一组点和适用于每对点的距离函数 我想将所有点连接在一起 总距离最小 你知道我可以使用的现有算法吗 每个点都可以链接到几个点 所以这不是通常的 推销员行程 问题 Thanks 你想要的是一个最小生成树 生成一个最常见的两种算法是 Prim
  • List 是否有协变可变版本?

    我已经将我真正想要注释的代码简化为这个最小版本 def print it numbers or nones for i number in enumerate numbers or nones if number is None numbe
  • 通过浏览器上传大文件(100 GB)

    有没有办法上传大文件 超过 80 GB 通过网络浏览器 以前我一直使用 plupload 上传文件 img png jpg 但它似乎不适用于较大的文件 我还想知道如何实现一个用户可以上传的网页 例如 Mega co nz 或 Drive g
  • context:annotation-config 是 @AutoWired 的替代品吗?

    我可以这样说吗 context annotation config在我的 XML 配置中 它会自动注入 bean 类而不需要任何注释 因此 不要使用这些注释类型 public class Mailman private String nam
  • Flask-Restless 转储 Flask-Sqlalchemy 中的十进制值

    我有这个使用 Flask SQLAlchemy 的模型 class Menu Document db Model id db Column db Integer primary key True autoincrement True nam
  • 如何通过home-brew m1 mac安装anaconda

    我刚买了一台 m1 Mac 并使用 home brew 安装了 anaconda brew install anaconda 看起来它工作得很好 除了当我真正去使用 anaconda 并输入 conda 时 我得到了可怕的 conda 命令
  • 在 Python 中求解具有时滞的 ODE

    任何人都可以给我一些建议 如何解决Python中实现了时间延迟的ODE 我似乎无法弄清楚如何使用 scipy integrate odeint 来做到这一点 我正在寻找的内容应该如下所示 the constants in the equat
  • 如何在控件中嵌入 firemonkey 表单?

    我尝试在滚动框中嵌入表单 procedure TfrmMain FormCreate Sender TObject var Control TControlView begin Control TControlView Create Sel
  • 用 Emacs 替换正则表达式

    我正在尝试做一个搜索并用正则表达式替换 假设我有一个foreach foo1 txt foo2 txt foo3 txt foo4 txt 我想在列表中的每个项目周围加上 我认为 从文档 这个正则表达式可以工作 foo 1 4 txt gt
  • glmnet 如何计算最大 lambda 值?

    The glmnet包使用了一系列LASSO调整参数lambda从最大缩放lambda max在此情况下不选择预测变量 我想知道如何glmnet计算这个lambda max价值 例如 在一个简单的数据集中 set seed 1 librar
  • 如何使用正则表达式前瞻来限制输入字符串的总长度

    我有这个正则表达式 想要添加限制总长度不超过 15 个字符的规则 我看到了一些前瞻示例 但它们不太清楚 你能帮我修改这个表达式以支持新规则吗 A Z A Z 既然您在标题中提到了这一点 那么对您的案例的负面展望将是 16 regex goe
  • Ruby 中重做和重试语句的用途是什么?

    我能想到的唯一用例redo适用于写入套接字或从数据库读取等操作 但如果这些操作失败一次 后续尝试很可能也会失败 所以对我来说这仍然有点毫无意义 至于retry我真的想不出它会有什么用处 这对我来说似乎毫无意义 因为我不知道也不使用 Ruby
  • CanExecuteCommand 对性能有影响吗?

    使用 ICommand 对象的 CanExecuteCommand 对性能有何影响 该方法是否一遍又一遍地执行 我需要迭代大约 200 个对象的集合 根据这些对象决定是否应启用绑定到命令的按钮 CanExecuteCommand 是否会重复