约什·史密斯 (Josh Smith) 的 RelayCommand 实现是否存在缺陷?

2024-03-28

考虑参考Josh Smith 的文章采用模型-视图-视图模型设计模式的 WPF 应用程序 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx,具体来说是一个示例实现RelayCommand(如图 3 所示)。 (这个问题不需要通读整篇文章。)

总的来说,我认为实施情况非常好,但我有一个关于授权的问题CanExecuteChanged订阅了CommandManager's RequerySuggested事件。这的文档RequerySuggested http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.requerysuggested%28VS.100%29.aspx states:

由于此事件是静态的,因此它会 只作为弱者抓住处理者 参考。监听的对象 这个活动应该保持强劲 引用他们的事件处理程序 避免它被垃圾收集。这 可以通过拥有一个来完成 私有字段并分配 处理程序作为之前或之后的值 附于本次活动。

然而示例实现RelayCommand不为订阅的处理程序维护任何此类内容:

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
}
  1. 这是否会将弱引用泄漏到RelayCommand的客户端,要求该用户RelayCommand了解实施CanExecuteChanged并自己维护实时参考?
  2. 如果是这样,是否有意义,例如修改RelayCommand如下所示,以减轻潜在的过早 GCCanExecuteChanged订户:

    // This event never actually fires.  It's purely lifetime mgm't.
    private event EventHandler canExecChangedRef;
    public event EventHandler CanExecuteChanged
    {
        add 
        { 
            CommandManager.RequerySuggested += value;
            this.canExecChangedRef += value;
        }
        remove 
        {
            this.canExecChangedRef -= value;
            CommandManager.RequerySuggested -= value; 
        }
    }
    

我在乔什的书中找到了答案comment http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/#comment-10430在他的“了解路由命令 http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/“ 文章:

[...]您必须在 CanExecuteChanged 中使用 Wea​​kEvent 模式 事件。这是因为视觉元素会挂钩该事件,并且因为 命令对象可能永远不会被垃圾回收,直到应用程序 关闭时,内存泄漏的可能性非常大。 [...]

论点似乎是这样的CanExecuteChanged实现者只能弱地保留已注册的处理程序,因为 WPFVisuals他们太愚蠢了,连自己都解脱了。这最容易通过委托给来实现CommandManager,谁已经这样做了。大概是出于同样的原因。

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

约什·史密斯 (Josh Smith) 的 RelayCommand 实现是否存在缺陷? 的相关文章

  • 在单独的线程上显示 WPF-“NotifyIcon”

    我目前正在开发一个 Office 加载项 我需要显示一个显示进度的通知对话框 我正在使用Philipp Sumi 的 wpf notifyicon http www codeproject com Articles 36468 WPF No
  • 如何在Dialog中使用数据绑定?

    我在对话框中实现数据绑定时遇到问题 是否可以 下面是我的 xml
  • 绑定到多个索引器

    我正在尝试将索引属性与两个索引器绑定 该属性看起来像这样 public Item this int x int y get return items x y set items x y value 根据http msdn microsoft
  • 如何在样式中访问控件父级的属性

    我的列表视图将项目数据模板化为标签 我正在为该标签设计一种样式 但我不知道如何访问父级的 ListViewItem IsSelected 属性 编辑 尝试了下面的建议 但仍然出现异常 这是我的完整代码
  • 将 KeyUp 作为参数传递 WPF 命令绑定文本框

    我有一个文本框 KeyUp 事件触发器连接到 WPF 中的命令 我需要将按下的实际键作为命令参数传递 该命令执行得很好 但处理它的代码需要知道按下的实际键 记住这可能是一个回车键或不仅仅是一个字母的任何键 所以我无法从 TextBox te
  • 如何将 MouseDown 事件放入样式中?

    这有效 XAML
  • 如何将 TargetNullValue 设置为日期?

    我使用 WPF 工具包的日历控件来允许用户选择日期 如果尚未选择日期 则 SelectedDate 绑定到的属性为 Null 这使得日历默认为公元 0 年 1 月 1 日 我想做类似的事情 SelectedDate Binding User
  • 使用画布矩形裁剪图像

    裁剪图像无法正常工作 我哪里错了 我的Xaml
  • 新的 Windows 应用程序 - 什么语言?

    我们目前正处于开发 Windows 桌面应用程序的前期阶段 但当听到有关 Windows 8 Silverlight WPF Jupiter 的所有最新讨论时 我不知道该相信什么了 现在用WPF启动一个新项目是不是有问题 我应该切换到 Si
  • 如何在MVVM中实现appSettings

    我正在尝试摆脱我使用的警告appSettings在 WPF 项目中 应用程序配置
  • 在 MVVM 中哪里可以捕获异常?

    我的视图模型类有一个连接到服务的方法 不确定这是否是一个好的实践 或者视图模型是否应该是严格的属性和属性更改机制 当然 我想在连接或断开连接时处理任何可能的 WCF 异常 让我们使用未找到端点作为示例 考虑到这是一个我想引起用户注意的异常
  • WPF 网格布局

    是否可以在 WPF 中使用 Grid 来设计类似的东西 设计列很容易 但是行呢 或者有没有更好的解决方案 比如另一个容器 将每个矩形想象为模块 GroupBox 创建一个包含两列的外部网格 在此网格中 放置另外两个网格 每列一个 这将导致所
  • 设置 TextBlock 以保留开头和结尾的空白?

    EDIT 下面的代码实际上按照我想要的方式工作 这个问题有点误导 请忽略它 通常当我设置Text的财产TextBlock像这样 TextBlock tb new TextBlock tb Text Hello World 文本开头和结尾的空
  • 如何按 z-index 对 Windows 进行排序?

    如果我枚举窗口Application Current Windows 对于任意两个窗口 我如何判断哪一个 更接近 即具有更大的 z index 或者 换句话说 我如何按 z 索引对这些窗口进行排序 您无法从 WPF 获取 Window 的
  • WPF 无法从 url 检索 WebP 图像?

    我无法从网址检索图像 以前 在设置 HttpClient 标头之前 我根本无法连接到该站点 我可以从其他来源检索图像 但不能从这个特定来源检索图像 检索图像的代码 var img new BitmapImage img BeginInit
  • WPF XAML 绑定和 CurrentCulture 显示

    当 CurrentCulture 更改时 我发现 XAML 文档出现一些无效行为 当我在窗口中有一些这样的元素时
  • 如何从 silverlight 中的视图模型从一个视图导航到另一个视图?

    我有一个 ViewModel 和两个 View 如何从 ViewModel 导航到 View2 我在某处读到我们需要使用 PRISM 在 Silverlight 中从 ViewModel 打开多个视图 PRISM 有什么替代方案吗 理想情况
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • 背景颜色变化

    SolidColorBrush bgColor public ModernBTN InitializeComponent this Loaded delegate object sender RoutedEventArgs e bgColo
  • 嵌套控件结构 - 使用 XAML 还是 C#?

    我想创建一个由相当多的元素组成的结构 它的基本布局如下

随机推荐

  • 如何更好地优化 iOS 上的网络?

    我在 GitHub 上创建了一个项目 以便我可以学习如何优化 iOS 应用程序的网络 我大量使用了块和 GCD 在观看 WWDC 2012 视频和过去几年的视频后 我了解到我可以使用 NSOperationQueue 做更多事情 具体来说
  • 在IIS上使用swagger发布web api

    在遵循此示例后 我正在尝试弄清楚如何使用 Swagger SwashBuckle 发布 net core 3 API 所以它可以在本地运行 当我按 F5 IIS Express 时 会在下面启动该网站http localhost 8033
  • 如何构建具有开放问题的 Dialogflow CX 代理?

    我正在尝试为 StackOverflow 之类的东西构建一个 Dialogflow 代理 它负责处理用户提出完整的问题 我想存储答案 并将其反馈给用户 例如 User I get an error CX Which error Java l
  • 扩展用户管理器

    在我的 NET Core 2 0 MVC 项目中 我添加了附加值来扩展 ApplicationUser public class ApplicationUser IdentityUser public string Name get set
  • java- libgdx build.gradle 与 AdMob 不同

    我正在为 android 构建一个应用程序并使用 libGdx 我检查了一百万个关于如何添加 Admob 的教程 每个教程都要求调整 build gradle 文件 但我的文件与他们的文件不一样 他们有依赖项和不同的东西 知道如何在我的 b
  • NSURLConnection 委托方法未执行

    我正在运行 Apple 的以下示例代码 NSString requestURL NSString alloc initWithString http google com NSURLRequest theRequest NSURLReque
  • numpy 中的数组按行排序

    我想按第一行对 numpy 中的数组进行排序 例如 import numpy as np test np array 1334 71601720318 930 9757468052002 1018 7038817663818 0 0 1 0
  • SDL - 绘制“负”圆圈(战争迷雾)

    我有这个 800x600square 我想绘制到屏幕上 我想在其中 切割 圆圈 其中 alpha 为 0 基本上我是在地图上绘制整个矩形 因此在我绘制的这些 圆圈 中 您可以看到地图 否则您会看到灰色方块 所以 我假设你想在你的一款游戏中添
  • 使用 jQuery datepicker 和 Angular 2 更改事件

    当我使用 jQuery datepicker 插件时 我在捕获更改事件时遇到一些问题 并且我尝试使用 change 方法来捕获更改 但似乎当我使用此插件时 角度无法捕获它 Component selector foo element tem
  • iframe 中的回调方法将值返回给 opener

    我必须在 iframe 中调用回调方法才能将值返回给 opener I know 挤压盒 http digitarald de project squeezebox 有 分配 打开 关闭 静态方法 但我不明白它是如何工作的 有人可以帮助我吗
  • 如何在文本文件更改时重新初始化 java servlet

    我有一个 servlet 它在初始化期间从文本文件中提取数据 现在我正在使用 cron 作业更新该文本文件 比如每天上午 10 点 并希望在每次该特定文件发生更改时重新初始化 servlet 我可以遵循的第二种方法是将 servlet 的重
  • 引用声明是否为引用对象引入了新名称?

    In 这个问题 https stackoverflow com q 33344259 560648我们知道 RVO 不能应用于像这样的表达式p first 在评论中还建议 RVO 通常不适用于类似这样的表达式r在声明之后auto r p f
  • 局部声明隐藏实例变量警告

    本地声明隐藏 self treatmentId treatmentId 附近的实例变量消息弹出窗口和 self treatmentName treatmentName implementation Treatment synthesize
  • 如何检索LDAP数据库的所有属性

    我在用LDAP模块 of python连接到LDAP服务器 我可以查询数据库 但我不知道如何查询检索数据库中存在的字段 这样我就可以提前通知用户查询数据库 告诉他他试图访问的字段不在数据库中 例如 如果存在的字段只是 cn memberOf
  • Flexbox 填充底部在 Firefox 和 Safari 中失败

    当向下滚动时 parentdiv 你应该在底部看到它的红色背景 因为padding bottom 这适用于 Chrome 但不适用于 Safari 和 Firefox container display flex width 200px h
  • iOS - 用于故事板检测 iPad / iPhone 设备的逻辑

    我需要将故事板定义为应用程序委托文件中身份验证脚本的一部分 用于将相关数据传递到特定视图 一切正常 但通过以这种方式定义我的故事板 我覆盖所有设备 iPad或iPhone 的路径 我希望我的应用程序是通用的 并遵循依赖于设备的不同故事板 因
  • 如何在 Laravel 5.3 中执行“内部”重定向

    我了解如何使用redirect 方法重定向用户 但此方法返回302代码 浏览器必须发出第二个HTTP请求 是否可以在内部将请求转发到不同的控制器和操作 我正在中间件中进行此检查 因此我的句柄函数如下所示 public function ha
  • 如何用JS在按钮点击时显示不同的div?

    我正在尝试制作一个有 2 张卡片的部分 每张卡片都有一个按钮和一个小的描述性文本 我想要实现的是 当我单击按钮时 会发生 3 件事 1 该按钮更改内容 从 变为 但这是我最不担心的 2 一个div显示与该卡对应的信息 占用100 vw 和
  • 共享扩展程序未上传全尺寸图像

    我正在为我的 iOS 应用程序开发共享扩展 我确实做了所有事情 但问题是我的代码仅适用于小图像 但是当我上传从设备摄像头拍摄的图像时 上传失败 只有文本被上传 void performUploadWith NSDictionary para
  • 约什·史密斯 (Josh Smith) 的 RelayCommand 实现是否存在缺陷?

    考虑参考Josh Smith 的文章采用模型 视图 视图模型设计模式的 WPF 应用程序 http msdn microsoft com en us magazine dd419663 aspx 具体来说是一个示例实现RelayComman