如果模型实现了 INotifyPropertyChanged,ViewModel 应该如何注册/取消注册 PropertyChanged 事件?

2024-02-04

我有一个实现的模型INotifyPropertyChanged并且它可能会被后台业务线程更新。其相关ViewModel也实现了INotifyPropertyChanged。他们的 View 显然绑定到 ViewModel。该视图可能会显示在多个位置,我的目标是当模型更改时所有这些位置都会更新。

我知道 ViewModel 应该注册PropertyChanged模型的事件。但我不知道这个注册和注销的最佳地点是何时何地。特别是关于取消注册,因为我害怕模型上有数百个 VM 事件处理程序用于不再显示的 VM/视图。

提前致谢。


您是否绝对有必要限制视图不直接绑定到模型?

您可以将模型公开为虚拟机上的属性,然后将视图直接绑定到它,从而不让虚拟机从模型订阅 INPC

就像是:

public class MyViewModel: INotifyPropertyChanged {
...

private MyModel _model;
public MyModel Model {
  get {
    return _model;
  }
  set {
    if (value == _model)
      return;
    value = _model;
    RaisePropertyChanged(() => Model);
  }
}
...

}

并在 xaml 中(当MyViewModel is the DataContext):

<TextBlock Text="{Binding Model.ModelProperty}" />

Update:

或许这对进入这个领域有一些帮助PropertyChanged模特们的“弱”时尚事件

IWeakEventListener http://msdn.microsoft.com/en-us/library/system.windows.iweakeventlistener.aspx

使用 Wea​​kEventManager 的中央事件调度,即使源对象生命周期超出了侦听器,也可以对侦听器的处理程序进行垃圾收集(或手动清除)。

这是用在

约什·史密斯的《PropertyObserver》 http://joshsmithonwpf.wordpress.com/2009/07/11/one-way-to-avoid-messy-propertychanged-event-handling/

这应该有望解决您需要显式取消注册的问题?

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

如果模型实现了 INotifyPropertyChanged,ViewModel 应该如何注册/取消注册 PropertyChanged 事件? 的相关文章

随机推荐

  • 如何阻止滚动条移动我的页面?

    我通过将页面内容包装在包装器 div 中 然后将其放入样式表中 将页面内容居中 wrapper width 960px margin left auto margin right auto 问题是 每当内容增加并且出现垂直滚动条时 它就会取
  • 如何计算同一类的元素数量?

    我的页面中有一个主 div 其中包含特定的内容id 现在 该类中存在一些同一类的输入元素div 那么我如何计算这个类中这些元素的数量div using jQuery With jQuery您可以使用 main div specific cl
  • java中可以有多个堆吗?

    java中可以有多个堆吗 如果可能的话 那么在什么情况下会发生呢 已经存在多个内存区域 但只有一个 Java 堆 通常有 Java heap which might be broken into 伊甸园空间 幸存者空间 任期空间 用于小型直
  • UICollectionView 和 SwiftUI?

    如何使用 SwiftUI 创建方形项目网格 例如在 iOS 照片库中 我尝试了这种方法 但它不起作用 var body some View List cellModels in Color orange frame width 100 he
  • 并排均匀打印 2 个均匀填充的列表

    我使用以下代码生成 2 个列表 nameList 和gradeList nameList gradeList for row in soup find all tr name row select th strong grade row s
  • Eclipse 问题 - 启动错误:无法连接到远程虚拟机。连接超时

    我收到消息 启动错误 无法连接到远程虚拟机 连接超时 每次我在读取设备上调试我的应用程序时 我在 AndroidManifest 中添加了
  • 如何通过 Go SDK 流式传输 Docker 容器日志

    我正在为 Go 中的一些游戏服务器软件编写一个工具 名为sampctl https github com Southclaws sampctl主要功能是为服务器实例启动 Docker 容器 然后捕获从容器中发出的日志 稍微清理一下并将它们发
  • iOS7 标签栏图标太大

    似乎我在处理像图标这样简单的事情时遇到了困难 我正在构建一个仅适用于 iOS7 的应用程序 因此设备是视网膜显示屏 不包括 iPad 2 所以我为我的标签栏制作了一些 60 x 60 的图标 然而这些太大了 而且 30 x 30 有点像素化
  • 从自定义 SurfaceView 获取位图

    我在一个扩展表面视图并实现可运行的类中有这段代码 我能够使用该类基本上允许您使用不同的颜色等绘制到画布上 我正在尝试找到一种方法 该方法允许我在绘制图像后保存图像 这就是方法 无论我做什么 我都会得到一张没有任何内容的黑色图像 有任何想法吗
  • Java - 字符缓冲区问题

    我有一个 1 99 GB 的字符文件 现在 我想从该文件中随机提取数百万个子序列 例如从位置 90 到 190 10 到 110 50000 到 50100 等 每个子序列长 100 个字符 我通常使用 FileChannel channe
  • 如何使用多线程进行zlib压缩(相同输入源)

    我的目标是在并行线程中压缩同一源的数据 我已经定义了列表中的作业 这些作业具有读取信息 每个作业中 500kb 1MB 我的压缩器线程将使用 ZLIB 压缩每个块的数据并将其存储在相应作业的 outbuf 中 现在 我想合并所有这些并创建一
  • 如何检测用户是否在浏览器中启用了全屏

    当用户在 Chrome 或 FireFox 中启用全屏时 是否会触发一些 JavaScript 事件 我有 WebGL 应用程序 画布宽度和高度设置为一定大小 当用户启用全屏时 我想调整其大小 如果没有这样的事件 我是否应该开始研究用画布填
  • 如何在 PyQt5 中使用全局键盘快捷键显示 QMenu?

    我试图通过热键 例如 F1 显示 QMenu 实例PyQt5 然后我找到了这个包keyboard https pypi org project keyboard 尝试像这样使用它 keyboard add hotkey F1 self sh
  • 将 HTML 表转换为 JSON

    我正在尝试将通过 BeautifulSoup 提取的表转换为 JSON 到目前为止 我已经成功隔离了所有行 但我不确定如何使用这里的数据 任何建议将非常感激 tr td strong Balance strong td td strong
  • WP8.1后退按钮退出应用程序

    上次我针对 Windows Phone 进行开发时使用的是版本 8 现在我正在使用 8 1 也许这是微软的一项新功能 但是当我按下手机上的后退按钮时 无论我对应用程序的了解有多深 应用程序都会最小化 这真的很烦人 有什么我可以做的吗 提前谢
  • 自动填充子图

    我正在编写一个 python 脚本 该脚本将 1 获取每个子图的 y 值列表 以针对一组通用的 x 值进行绘制 2 将每个子图设为散点图并放置将其放置在子图网格中的适当位置 并且 3 针对不同大小的子图网格完成这些任务 第三个语句的意思是
  • 我是否需要更改 xml 代码以支持所有屏幕尺寸的 Android 设备?

    我已经为不同的屏幕尺寸创建了布局 这是我的默认布局的 xml 代码 但所以任何人请告诉我应该做什么来支持任何屏幕尺寸的 Android 设备的布局 我需要更改我的 xml 代码吗 或者 只是我需要修改我的xml代码吗 请告诉我 以便我解决我
  • Python 2.7 的 Shebang 线

    我已经在我的Linux Centos中安装了Python2 7 它默认安装了Python2 6 默认Python root linuxhost PythonProjects python V Python 2 6 6 默认Python2 7
  • 错误:找不到字段的设置器。 - java.util.ArrayList 中的大小 - Room 中的嵌入式 ArrayList 无法编译

    我在将 Android 4 1 2 更新到 4 2 2 后收到此错误消息 但在将 Android Studio 更新到 4 1 2 以上的任何版本后收到此错误消息 What went wrong Execution failed for t
  • 如果模型实现了 INotifyPropertyChanged,ViewModel 应该如何注册/取消注册 PropertyChanged 事件?

    我有一个实现的模型INotifyPropertyChanged并且它可能会被后台业务线程更新 其相关ViewModel也实现了INotifyPropertyChanged 他们的 View 显然绑定到 ViewModel 该视图可能会显示在