ViewModel 订阅特定属性的 Model 的 PropertyChanged 事件

2024-01-20

我希望在模型中的属性更改时执行 methodToBeCalledWhenPropertyIsSet() 。

我怎么能这样做呢?

如果我理解正确的话,我可以添加MyModel.PropertyChanged += methodToBeCalledWhenPropertyIsSet一般情况下,我的 ViewModel 中的某个位置可以订阅 PropertyChanged 事件,但我只关心何时设置 Property

public class ViewModel : INotifyPropertyChanged
{
    ...

    public Model MyModel { get; set; }

    public void methodToBeCalledWhenPropertyIsSet() { }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class Model : INotifyPropertyChanged
{
    object _propertyField;
    public object Property
    {
        get
        {
            return _propertyField;
        }
        set
        {
            _propertyField = value;
             OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

INotifyPropertyChanged 接口解决了这个问题。将您的视图模型订阅到模型 PropertyChangedEventHandler 并过滤您的结果。

public class ViewModel : INotifyPropertyChanged
{
    ...

    public Model MyModel { get; set; }

    public void methodToBeCalledWhenPropertyIsSet() { }

    public event PropertyChangedEventHandler PropertyChanged;

    public ViewModel()
    {
        // MyModel would need to be set in this example.
        MyModel.PropertyChanged += Model_PropertyChanged;
    }

    private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if(e.PropertyName == "Property")
        {
             methodToBeCalledWhenPropertyIsSet();
        }
    }
}

在 MVVM 模式中,视图模型旨在处理这样的混乱情况。这仍然保留了您对模型的抽象。

Edit正如 HighCore 指出的,此代码无法复制粘贴。 MyModel 需要事先实例化。我用MEF(http://msdn.microsoft.com/en-us/library/dd460648(v=vs.110).aspx http://msdn.microsoft.com/en-us/library/dd460648%28v=vs.110%29.aspx) 以此目的。您可以直接获取模型类,也可以使用某种工厂/管理器来获取引用。

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

ViewModel 订阅特定属性的 Model 的 PropertyChanged 事件 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 房间迁移更改表不添加新列并一次又一次地调用迁移

    所以基本上我正在使用空间并尝试添加从数据库版本 1 到 2 的迁移 但我的 alter 命令不起作用 我当前的实现如下 void init db Room databaseBuilder Global getInstance AppData
  • javascript 语法:函数调用和使用括号

    为什么这有效 但不是这个
  • 将 int 转换为 char 而不使用 ASCII [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我如何将小于 10 的 int 转换为 char 例如 5 gt 5 不使用 ASCII 表将 int 转换为 char 由于数字在标准字符
  • php exec 输出被修剪

    我在 php 中使用 exec 又遇到了另一个麻烦我的操作系统是 suse linux 我使用的是 php 5 1 2 不知何故 当我使用 exec 时 我的输出被修剪 in linux gt ps ef grep java root 35
  • Azure AD - 始终需要范围,因此需要一个默认范围

    我已经为一家企业实施了 Azure AD 好吧 还没有完全完成 目的是只有企业中的人员可以使用它 他们必须位于企业的 Active Directory 中 并且存在仅分配给某些用户的特殊目标角色 范围 REST 端点用这些范围进行注释 在
  • 如何选择与行跨度对应的行?

    我有一个动态生成的表 我试图更改其中某些行的背景颜色 有时有些行具有行跨度 我无法弄清楚如何获取与一个 行 相对应的所有行 我用谷歌搜索了我的大脑 发现这个 jsfiddle 非常接近我需要的 在逻辑意义上 http jsfiddle ne
  • 搜索引擎可以索引 JavaScript 生成的网页吗?

    Google 等搜索引擎可以索引 JavaScript 生成的网页吗 当您右键单击并选择在由 JavaScript 例如使用 GWT 生成的页面中查看源代码时 您看不到动态生成的 HTML 我想 如果搜索引擎也看不到生成的 HTML 那么就
  • AppDomain 中的静态字段

    我正在尝试使用 AppDomain 来管理多线程环境中包含大量静态字段的一些遗留代码 我读到这个问题的答案 如何使用 AppDomain 限制静态类的范围以实现线程安全使用 https stackoverflow com questions
  • 经过一段时间后,OpenEdge ABL 自动关闭是/否消息

    现在我有 消息 Hello World 查看为警报框警告按钮是 否更新 lVariable 如何在 14 秒后自动点击 否 如何以 另一种方式 做到这一点 DEFINE FRAME f message This is your messag
  • Django(主干)和基于类的通用视图:一个表单的初始数据出现在另一个表单中

    我遇到了一个奇怪的问题 数据似乎在不同的视图和请求中持续存在 直到服务器重新启动 我已设法将问题简化为以下代码 foobar models py from django db import models class Foo models M
  • CoreData:注释:无法加载优化模型(React Native)

    我无法再启动我的反应本机应用程序 我昨天更新了XCode 也许和它有关 react native run ios Found Xcode workspace xyz xcworkspace CoreData annotation Faile
  • iPhone 上的“不受信任的服务器证书”

    我正在编写一个 iPhone 应用程序 我想连接到 HTTPS 服务器以获取一些信息 但是 我在控制台中收到错误 NSUnderlyingError 错误域 kCFErrorDomainCFNetwork 代码 1202 UserInfo
  • Django Fabric 同步数据库

    您将如何运行此 django 命令来自动与 Fabric 同步数据库 python manage py syncdb settings app settings test 如果尝试运行 它会卡在 是否要创建超级用户帐户 处 是否可以传递 是
  • Facebook API 错误 191

    我正在尝试将我的项目与 Facebook 集成 我一开始只是尝试登录 获取 Facebook 会话并获取一些用户数据 我在本地开发它 所以我的 Facebook 应用程序设置是 site URL http 127 0 0 1 8888 my
  • 给 Java 桌面应用程序换肤?

    有谁知道一种 皮肤 Java 桌面应用程序的方法吗 例如 Winamp 皮肤或 MirandaIM 皮肤 我不想创造自己的外观和感觉 是的 有几种方法可以做到这一点 但我不知道有谁是真正简单的 看一下Nimbus Swing 的新面貌 ht
  • Math.pow(65,17) % 3233 的令人惊讶的结果

    由于某种原因 在处理大数时 模运算符没有给出正确的输出 请查看代码 double x Math pow 65 17 3233 输出应该是2790但输出是887 0 我确信这很愚蠢 但我无法绕过它 提前致谢 的结果Math pow 65 17
  • 部分代码覆盖率 C# - Nunit

    我有部分代码覆盖率 但我不知道为什么 对于在开始阅读之前喜欢这个问题的人 首先想说 第一篇文章 我的开发生涯还很初级 但我的学习速度相对较快 我认为 所以就这样吧 使用Junit进行测试 并基于MVP 待测试代码 void view Del
  • Express.js:如何获取远程客户端地址

    我不完全明白我应该如何获取远程用户IP地址 假设我有一个简单的请求路线 例如 app get function req res var forwardedIpsStr req header x forwarded for var IP if
  • 对象标签在 Chrome v41 之前显示 PDF,但在 v42(最新版本)中显示空白

    我有一个处于生产模式的应用程序 到目前为止运行得很好 我用过标签通过向对象标签提供base64编码数据来显示PDF 即使我没有 Adob e reader 插件 Chrome 也能正确显示它 因为它有内部 pdf 插件 但今天 我已将 Ch
  • ViewModel 订阅特定属性的 Model 的 PropertyChanged 事件

    我希望在模型中的属性更改时执行 methodToBeCalledWhenPropertyIsSet 我怎么能这样做呢 如果我理解正确的话 我可以添加MyModel PropertyChanged methodToBeCalledWhenPr