MVVM INotifyPropertyChanged 与自动属性名称实现

2023-12-27

根据我的理解,我们可以在 MVVM 风格的应用程序中使用 INofityProperty,代码类似于以下内容

    object _SelectedPerson;
    public object SelectedPerson
    {
        get
        {
            return _SelectedPerson;
        }
        set
        {
            if (_SelectedPerson != value)
            {
                _SelectedPerson = value;
                RaisePropertyChanged("SelectedPerson");
            }
        }
    }

现在,我已经看到了约什·史密斯的出色榜样 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx他在其中实现了额外的代码来捕获如果开发人员输入无法识别的属性名称(例如拼写错误)时会发生什么情况!

如果您讨厌这个,请告诉我,但是有一种方法可以从堆栈跟踪中获取方法名称。所以,我们可以改为实现类似的东西

    object _SelectedPerson;
    public object SelectedPerson
    {
        get
        {
            return _SelectedPerson;
        }
        set
        {
            if (_SelectedPerson != value)
            {
                _SelectedPerson = value;
                RaisePropertyChanged(Current.Method);
            }
        }
    }

static class Current
{
    public static string Method()
    {
        StackTrace st = new StackTrace();
        return (st.GetFrame(1).GetMethod().Name.Split('_')[1]);            
    }
}

我只能假设这总是有效,因为 RaisePropertyChanged 事件总是发生在 Setter 中(如果我错了,请纠正我)。

现在请注意,我无法真正尝试这个,因为在工作中(我可以从事更大的项目)我仍然使用 .NET 2.0,所以 WPF/MVVM 未来还有很长的路要走但我正在用自己的时间学习。

所以,我的问题来自那些使用过它的人,与删除错误选项相比,有一种警告用户错误的方法真的更好吗?事实是,约什·史密斯是公认的该领域的专家,因此,如果他建议采用这种方法,那么通常我会盲目遵循,但在这种情况下,我忍不住要质疑它并觉得有必要了解更多。


您可以通过抽象基类执行 INotifyPropertyChanged。这可能如下所示:

        public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Event, fired when the Property has changed
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="propertyExpression">() => this.Param</param>
    protected virtual void OnPropertyChanged<T>(Expression<Func<T>> propertyExpression)
    {
        var propertyName = ExtractPropertyName(propertyExpression);
        OnPropertyChanged(propertyName);
    }

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    /// <summary>
    /// Extracts the propertyname out of the Expression given
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="propertyExpression"></param>
    /// <returns></returns>
    private static string ExtractPropertyName<T>(Expression<Func<T>> propertyExpression)
    {
        var memberExpression = propertyExpression.Body as MemberExpression;
        return memberExpression == null ? null : memberExpression.Member.Name;
    }
}

在 .Net 4.5 中,您可以创建一个类,如下所示:

 public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

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

在那里你只需要打电话

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

MVVM INotifyPropertyChanged 与自动属性名称实现 的相关文章

  • 在多线程场景中正确锁定 List

    好吧 我只是无法正确理解多线程场景 抱歉再次问类似的问题 我只是在互联网上看到许多不同的 事实 public static class MyClass private static List
  • 捕获非特定异常(例如 System.Exception)是一种不好的做法吗?为什么?

    我目前正在进行代码审查 下面的代码让我跳了起来 我发现这段代码存在多个问题 你是否同意我的观点 如果是这样 我该如何向我的同事解释这是错误的 顽固型 捕获一般异常 Exception ex 使用 if ex 是某物 而不是另一个 catch
  • 流行的“易失性轮询标志”模式被打破了吗?

    假设我想使用布尔状态标志来进行线程之间的协作取消 我意识到人们最好应该使用CancellationTokenSource反而 这不是这个问题的重点 private volatile bool stopping public void Sta
  • 检查输出是否重定向

    我有一个用 C 编写的控制台应用程序 它处理一些数据然后打印结果 在结果可用之前 会有一个小动画 和不断更新的进度百分比 xx 显然 如果用户重定向我的应用程序的输出 这将被打印到输出重定向到的文本文件中 如果可能的话我想避免这种情况 那么
  • 如何重置 MS Access 中的身份列

    我有一个 Windows 应用程序连接到MS Access 2007数据库 已有300多条记录Customer Table 我已经删除了所有记录 但插入新记录后CustomerID回报301 但我想将其设置为1 我尝试了以下查询 ALter
  • iOS 应用程序和.NET 应用程序之间的通信?

    我有 2 个应用程序 一个是 iOS 应用程序 一个是 NET 应用程序 我希望我的 iOS 应用程序发送一条消息 调用 NET 应用程序的方法 将一些字符串发送到 NET 应用程序以保存到数据库 那么 我的 iOS 应用程序如何与 NET
  • wpf C# 中的内存泄漏

    我正在使用 GalaSoft MvvmLight 套件和 WPF Toolkit 开发 WPF MVVM v3 5 中 应用程序DataGrid and DatePicker 但是 每次加载应用程序时 我都会面临应用程序中的大量内存泄漏Us
  • 从 Windows 选择声音并播放它们

    我有一个 WinForms 应用程序 该应用程序有一个 首选项 部分 用户可以在其中选择显示警报时播放哪些声音 是否可以有一个组合框 用户可以从 Windows 存储的声音中进行选择 例如 紧急停止 紧急蜂鸣 等 这些可以在 控制面板 gt
  • 如何有条件地调用带有约束的泛型方法? [复制]

    这个问题在这里已经有答案了 Suppose I have an unconstrained generic method that works on all types supporting equality It performs pai
  • 为什么 localInit Func 在 Parallel.ForEach 中每个线程被调用多次

    我正在编写一些代码来处理大量数据 我认为让 Parallel ForEach 为它创建的每个线程创建一个文件会很有用 这样输出就不需要同步 至少对我而言 它看起来像这样 Parallel ForEach vals new ParallelO
  • .NET 中是否可以抑制第 2 代 GC 收集?

    我的程序分配了大量的实例 这些实例组成了长期存在的 DAWG 在构建此 DAWG 的过程中 有时进度会减慢 100 倍 这与 NET 执行第 2 代 GC 收集完美相关 在此期间 GC 时间百分比 为 99 5 并且 第 2 代总回收量 每
  • 为什么 WCF 不能传递字典中的对象?

    在我的 WCF 服务中 我有一个对象QualifiedNumber定义为KnownType and ServiceKnown类型 如果我使用QualifiedNumber通过以下方法 这个不起作用 它抛出一个异常 部分内容如下 元素 htt
  • 如何使用 C# 在 .NET 中获取格式化 JSON?

    我正在使用 NET JSON 解析器 并希望序列化我的配置文件 以便它可读 所以而不是 blah v blah2 v2 我想要一些更好的东西 比如 blah v blah2 v2 我的代码是这样的 using System Web Scri
  • 将参数传递给 .NET 定义的命令

    我需要在 Autocad 2000i 的命令行上编写一个命令 并且希望 autocad 提示输入参数 然后我的 vb net 程序将根据收到的参数进行操作 基本上我想我的解决方案都在这里 http through the interface
  • .NET 4.0 迁移后引用 .NET 1.0 程序集的 System.TypeLoadException

    有一个项目从 NET 3 5 迁移到 NET 4 0 该项目有一些对 NET 1 0 程序集的引用 这些程序集是 COM 对象的包装器 这些 NET 1 0 程序集和 COM 对象是外部公司的产品 该项目可以编译 但在运行时 当软件引用这些
  • 在运行时从调试可视化工具中检测源语言

    我正在写一个Visual Studio 的调试可视化工具 https github com zspitz ExpressionToString visual studio debugger visualizer for expression
  • 如何将隐藏字段从一个页面传递到另一页面?

    我有一个 Net 类库 我想从一次代码隐藏页面传递一个隐藏变量 并在另一个代码隐藏页面中获取它 请注意 我没有任何可以使用表单标签和 get post 方法的设计页面 aspx 页面 我们应该怎么做 注意 我想使用隐藏字段将值从一页传递到另
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 配置 2 在按钮 swiftUI 中发出警报消息

    我要学习 swift 和 swiftUI 我申请按类别整理笔记 如果需要的话 你可以在我的 GitHub 中找到我的项目 https github com yoan8306 List Notes https github com yoan8
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt

随机推荐

  • zabbix UserParameter返回2个或多个值

    i use UserParameter Firebird F tools zabbix agent firebird Firebird bat 1 如何在 1 次运行的 bat 文件中获取两个或更多值 您正在寻找https www zabb
  • 实体框架CTP4:SetInitializer放在哪里?

    我正在尝试使用 CTP4 预览将实体框架 首先是代码 添加到使用测试数据运行的 MVC 应用程序 我目前收到此错误 自创建数据库以来 支持 SchedulerContext 上下文的模型已发生变化 手动删除 更新数据库 或使用 IDatab
  • 我是否需要为每个新的 .swift 文件创建一个新的 SpriteKit 关卡编辑器文件?

    我正在尝试熟悉 Sprite Kit 关卡编辑器 默认情况下 有一个 gamescene sks 文件附加到 gamescene swift 例如 如果我正在制作 gameoverscene 或 playscene 如果我想在关卡编辑器中使
  • 将列从 varchar(8000) 更改为 varchar(max) 是否存在任何隐藏的陷阱?

    我有很多 超过一千个地方 的遗产T SQL代码只使INSERT变成一个varchar 8000 实用程序表中的列 我们的需求发生了变化 现在该列需要能够处理更大的值 结果我需要制作该专栏varchar max 这只是一个纯数据列 没有对其执
  • hibernate标准查询时间戳

    我有一个表 其中有一列 Submitted date 没有时区的时间戳 我需要列出表中具有特定日期作为提交日期的所有记录 但不考虑数据库中的时间 我通过使用条件查询和休眠来检索记录 怎么忽略这里的时间呢 实际上 我从客户端传递了一个日期 并
  • 如何在 Meteor 中从服务器调用客户端方法?

    使用 Meteor 方法可以轻松完成相反的操作 从客户端调用服务器端 假设您想要从服务器直接运行客户端方法或作为回调运行客户端方法 一个例子是用户在您的网站上注册 在服务器上注册成功后 会弹出一个模式窗口 提醒他们注册已成功 我们试图追求单
  • 在复杂条件下使用 JPA 实体图

    我有一个基于 Spring MVC JPA Hibernate 构建的项目 我使用实体图 JPA 2 1 来定义从数据库中获取哪些数据 如下例所示 EntityGraph
  • 动态 PHP ZIP 文件

    从服务器上的文件夹中压缩 例如 2 个 文件并强制下载的最简单方法是什么 无需将 zip 保存到服务器 zip new ZipArchive the string file1 is the name we re assigning the
  • 使小部件在 Qt 布局中部分重叠

    我正在尝试使小部件在 Qt 布局中部分重叠 我当前的布局如下 通过QVBox布局 http doc qt io qt 4 8 qVboxlayout html含有四个QHBox布局 http doc qt io qt 4 8 qhboxla
  • 如何检测 Windows 10 是否处于平板电脑模式

    我正在尝试找到一种方法来检测 Windows 10 是否处于平板电脑模式 请注意 这不是查询用户是否有平板电脑 这可以通过以下方式解决GetSystemMetrics SM CONVERTIBLESLATEMODE 就我而言 无论 Win1
  • 从一组给定的数字中生成选择的最佳方法是什么?

    例如 如果要求在 1 到 5 之间做出所有选择 答案如下所示 1 2 3 4 5 1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5 1 2 3 1 2 4 1 2 5 1 3 4 1 2 3 4 5 谁能建议一
  • YAML 中的单个感叹号有什么作用?

    我正在与YamlDotNet http sourceforge net projects yamldotnet 库 加载 YAML 文件时出现此错误 解析标签时 未找到预期的标签 URI YAML 文件应该是格式良好的 因为它来自直接从 R
  • 正文中的邮件链接和换行符

    In a mailto链接 我正在尝试使用换行符 但我失败了 我尝试过 n n br 并尝试搜索 Enter 的 ascii 值 但我没有得到我想要的内容 a href Mail me a 你们能帮忙吗 Use 0D 0A body Hel
  • 参数类型中的这三个点是什么[重复]

    这个问题在这里已经有答案了 可能的重复 该方法签名中的省略号代表什么 https stackoverflow com questions 2367398 what is the ellipsis for in this method sig
  • 如何使 QListWidget 项目可编辑

    我是 PyQt 的新手 我首先在Qt Designer中制作了一个对话框 并在QListWidget中实现了简单的添加 删除 向上 向下操作 除了编辑之外的所有操作都很有效 所以我做了很多关于如何使项目可编辑的搜索 但结果并不令人满意 我能
  • Imageview 不显示圆角

    我试图使我的布局像这样 但我无法使我的图像视图像这样带有圆角 它在 Android studio 的布局编辑器中完美显示 但在真实设备中我得到的是平角 我厌倦了 XML 和代码 但没有一个对我有用 请帮助我使我的布局像这个示例图像一样 我的
  • Python:基于 Pandas 中的 2 列进行分箱

    寻找一种基于 Pandas 中的 2 列的快速而优雅的分类方式 这是我的数据框 filename height width 0 shopfronts 23092017 3 285 jpg 750 0 560 0 1 shopfronts 2
  • Ruby on Rails - 生成 bit.ly 样式标识符

    我正在尝试生成与 bit ly url 样式相同的 UUID 例如 http bit dot ly aUekJP 或 cloudapp 的 http cl dot ly 1hVU 甚至更小 我该怎么做 我现在正在为 ruby 使用 UUID
  • DTM - s.t函数与页面加载规则关系

    我不清楚动态标签管理器 DTM 如何执行 Adob e Analytics 页面加载规则 特别是它何时触发 Adob e Analytics 请求 s t 函数 Adobe 提供了此图 https marketing adobe com r
  • MVVM INotifyPropertyChanged 与自动属性名称实现

    根据我的理解 我们可以在 MVVM 风格的应用程序中使用 INofityProperty 代码类似于以下内容 object SelectedPerson public object SelectedPerson get return Sel