触发 OnPropertyChanged 的​​更好方法

2024-06-23

我们有一个遵循 MVVM 模式的 WPF 项目。

在视图模型中有很多代码,如下所示:

    private string m_Fieldname;
    public string Fieldname
    {
        get { return m_Fieldname; }
        set
        {
            m_Fieldname = value;
            OnPropertyChanged("Fieldname");
        }
    }

有没有一种方法可以做到这一点并且需要更少的代码?

像这样的事情会很好:

[NotifyWhenChanged]
public string Fieldname { get; set ; }

你可以看看后锐利 http://www.sharpcrafters.com/。他们甚至有一个样品数据绑定 http://www.sharpcrafters.com/solutions/notifypropertychanged。从那里获取的代码:

/// <summary>
/// Aspect that, when apply on a class, fully implements the interface 
/// <see cref="INotifyPropertyChanged"/> into that class, and overrides all properties to
/// that they raise the event <see cref="INotifyPropertyChanged.PropertyChanged"/>.
/// </summary>
[Serializable]
[IntroduceInterface( typeof(INotifyPropertyChanged), 
                     OverrideAction = InterfaceOverrideAction.Ignore )]
[MulticastAttributeUsage( MulticastTargets.Class, 
                          Inheritance = MulticastInheritance.Strict )]
public sealed class NotifyPropertyChangedAttribute : InstanceLevelAspect, 
                                                     INotifyPropertyChanged
{

    /// <summary>
    /// Field bound at runtime to a delegate of the method <c>OnPropertyChanged</c>.
    /// </summary>
    [ImportMember( "OnPropertyChanged", IsRequired = false)] 
    public Action<string> OnPropertyChangedMethod;

    /// <summary>
    /// Method introduced in the target type (unless it is already present);
    /// raises the <see cref="PropertyChanged"/> event.
    /// </summary>
    /// <param name="propertyName">Name of the property.</param>
    [IntroduceMember( Visibility = Visibility.Family, IsVirtual = true, 
                      OverrideAction = MemberOverrideAction.Ignore )]
    public void OnPropertyChanged( string propertyName )
    {
        if ( this.PropertyChanged != null )
        {
           this.PropertyChanged( this.Instance, 
                                  new PropertyChangedEventArgs( propertyName ) );
        }
    }

    /// <summary>
    /// Event introduced in the target type (unless it is already present);
    /// raised whenever a property has changed.
    /// </summary>
    [IntroduceMember( OverrideAction = MemberOverrideAction.Ignore )]
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Method intercepting any call to a property setter.
    /// </summary>
    /// <param name="args">Aspect arguments.</param>
    [OnLocationSetValueAdvice, 
     MulticastPointcut( Targets = MulticastTargets.Property, 
         Attributes = MulticastAttributes.Instance)]
    public void OnPropertySet( LocationInterceptionArgs args )
    {
        // Don't go further if the new value is equal to the old one.
        // (Possibly use object.Equals here).
        if ( args.Value == args.GetCurrentValue() ) return;

        // Actually sets the value.
        args.ProceedSetValue();

        // Invoke method OnPropertyChanged (our, the base one, or the overridden one).
        this.OnPropertyChangedMethod.Invoke( args.Location.Name );

    }
}

用法就这么简单:

[NotifyPropertyChanged]
public class Shape
{
   public double X { get; set; }
   public double Y { get; set; }
}

示例取自 PostSharp 网站并插入以完成答案

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

触发 OnPropertyChanged 的​​更好方法 的相关文章

  • 我们可以在 C# 中定义枚举的隐式转换吗?

    是否可以在 C 中定义枚举的隐式转换 可以实现这一目标的东西吗 public enum MyEnum one 1 two 2 MyEnum number MyEnum one long i number 如果没有 为什么不呢 有一个解决方案
  • MVC。网络错误:初始化字符串的格式不符合从索引 0 开始的规范

    我的连接字符串是
  • 在 2 个 .c 文件之间共享函数

    dir1有dir2 file1 c和file1 h dir2 有 file2 c 现在 如果我想在 file2 c 中访问 file1 c 中定义的函数 我需要在 file1 h 中声明它并在 file2 c 中包含 file1 h 这是一
  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • 运行时两个注册之间的简单注入器基于动态上下文的注入

    我有一个使用 Simple Injector 进行命令处理程序注册的中介应用程序 并且注入和处理程序均已设置并完美运行 class DoWashingCommandHandler IRequestHandler
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 指向指针的指针和指向二维数组的指针之间的区别

    如果我有一个二维数组 B 定义为 int B 2 3 1 3 5 2 4 6 Is int p B与 一样int p 3 B int f B printf d f 1 gives 5作为输出 同时printf d f 给出 1 作为答案 为
  • 在 C/C++ 中绘制填充椭圆的简单算法

    在SO上 找到了以下绘制实心圆的简单算法 for int y radius y lt radius y for int x radius x lt radius x if x x y y lt radius radius setpixel
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 简单的喷射器将具体类型与生活方式结合起来

    我正在寻找一种可以使用指定的生活方式注册具体类型的方法 基本上如下所示 public void SomeFunction Type concrete Lifestyle lifestyle gt container Register con
  • 没有类型的 IEnumerable 属性

    我正在尝试创建一个类似于来自 MSDN 的官方 DataGrid ItemsSource 的属性 public IEnumerable ItemsSource get set 这提供了对任何派生类中任何类型的支持 有了这个 我可以设置类似的
  • 矩阵行列式算法 C++

    我是编程新手 我一直在寻找一种找到矩阵行列式的方法 我在网上找到了这段代码 但我很难理解这里的算法 我对递归的基础没有问题 但继续和主循环我很难理解 非常感谢任何可以向我解释该算法的人 int determ int a MAX MAX in
  • 更快的 WinSock sendto()

    我使用的是 Windows Server 2008 我的程序是用 C 编写的 我在 while true 循环中使用 WinSock2 和 sendto 来发送数据包 代码如下 while true if c snd gt max c sn
  • 64 位随机生成器种子

    我目前正在运行一个具有 8 个以上管道 线程 的多线程模拟应用程序 这些管道运行非常复杂的代码 该代码取决于种子生成的随机序列 然后该序列被归结为单个 0 1 我希望在将种子从主线程传递到处理管道后 这种 随机处理 具有 100 的确定性
  • 预览MouseMove 与 MouseMove

    我有相当多的 XAML 经验 但最近我注意到我的大多数同事都使用预览鼠标移动代替鼠标移动事件 我一直用鼠标移动它对我很有帮助 但我忍不住问我什么时候应该使用预览鼠标移动什么时候鼠标移动 有什么区别 各自有什么优点和缺点等等 PreviewM
  • 如何从与 C# lambda 集成(而非代理集成)的 Amazon API 网关获取正确的 http 状态代码?

    我正在使用 C lambda 与 API 网关集成 我希望 API 网关返回正确的错误代码 例如 400 404 500 等 API网关模块tf文件 provider aws version lt 2 70 0 region var aws
  • RC4 实现与 openssl 输出不匹配

    我的目标是在 C C 中实现 RC4 流密码 并确保它产生与使用时相同的输出openssl命令 按照伪代码维基百科 https en wikipedia org wiki RC4 该实现似乎有效 因为它可以加密和解密内容 但是 加密的输出与

随机推荐

  • 在 Android 的列表视图中仅突出显示所选项目

    我有一个列表视图contactslist 我编写了用于突出显示所选项目的代码ListView 这是工作 当我单击一个项目时 它会突出显示该项目 但问题是如果我单击另一项目 它也会突出显示该项目 我只想突出显示所选项目 当我单击另一个项目时
  • Spring 安全角色层次结构无法使用 Java Config 工作

    首先 我是 Java Spring 框架的新手 如果我没有提供足够的信息 请原谅我 我尝试将角色层次结构添加到我的应用程序中 但没有成功 以下是我尝试过的代码 安全配置 java These config is try to set up
  • 文本:从右到左 (CSS)

    是否有 CSS 代码可以更改此文本 This is it 到这个 ti si sihT Try this cssClassName direction rtl unicode bidi bidi override 编辑 将此类应用于段落标签
  • 关键字final有什么用?

    在下面的代码中 如果我从 EditText 中删除关键字 Final 我会在第 6 行中出现错误 其中我将 EditText 对象 et 传递给意图 我必须知道这里 Final 关键字的重要性 final EditText et EditT
  • Jquery Validate - 类列表

    这可能是一个非常愚蠢的问题 但我正在寻找 jquery 表单验证器的内联验证规则列表 我知道我能找到这里有js函数 http docs jquery com Plugins Validation List of built in Valid
  • 从 C# 中的两个类继承[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的多重继承 https stackoverflow com questions 178333 multiple inheritance in c sharp 我有两个类A类和B类 这两个类不能互
  • 自定义 __str__ 和 __repr__ 不起作用

    我正在尝试转换输出 例如 decrypt
  • 从客户端 Web 浏览器与串行端口进行通信。

    在我的 Web 应用程序 sencha extjs 5 中 我有一个用户要求将数据读 写到客户端 PC 串行端口 我知道客户端浏览器如果不在本地计算机上安装一些二进制文件 本机应用程序 Windows 服务等 就无法访 问本地计算机硬件 几
  • javascript 中 div 元素的边框[重复]

    这个问题在这里已经有答案了 我想给div设置边框半径box在 javascript 中 因为我已经屈服了 css 作为边框 2px 实心 000 我怎样才能把它放在下面给出的 for 循环中 elements document getEle
  • 如何将 Maven 安装到 Red Hat Enterprise Linux 6 中?

    我正在开发一个 Scientific Linux 盒子 并尝试使用以下命令安装 Mavenyum命令 对于那些不知道的人来说 Scientific Linux 是基于 Red Hat Linux Enterprise Edition 6 的
  • 使用 q.js 链接 Promise

    我试图了解承诺链是如何工作的 我在用着q js https github com kriskowal q 这就是我正在玩的东西 var Q require q npm install q the function Q value retur
  • 在调用 clFinish 或 clWaitForEvents 之前,OpenCL 内核不会开始执行

    我正在尝试在 GPU 上运行内核并在主机 CPU 上进行额外的计算 我看到这样的效果 只有内核需要大约 2000 毫秒 clEnqueueNDRangeKernel clFinish 或 clWaitForEvents 我都尝试过 我用 s
  • 在可在 Blackberry 设备和 Windows Mobile 6.5 上运行的网页上嵌入视频

    我正在尝试在一个网站上嵌入一个视频 该视频将在黑莓和 Windows Mobile 6 5 设备上播放 目前正在黑莓 curve 和 acer betouch 上进行测试 但似乎没有任何进展 黑莓Flash 不起作用 HTML5 视频也不起
  • C# 私有成员可见性

    我们的商业模式中有一个学生课程 令我感到奇怪的是 如果我们从另一个学生操纵一个学生 则学生的私人成员是可见的 这是为什么 class Program static void Main string args Student s1 new S
  • 从性能角度来说,是每次调用给定数组的长度更好,还是将长度存储在变量中并每次调用该变量更好?

    我经常调用给定数组的长度 我想知道是否最好继续调用它多次 目前超过 50 次 但它一直在增长 还是将长度存储在整数中并使用每次都是那个整数 如果我不清楚我所说的内容 请考虑以下几点 我有一个字符串数组 String str new Stri
  • 为什么返回 *this 会导致无限循环?

    class binaryOperators public int i binaryOperators int tempI 0 i tempI binaryOperators operator const binaryOperators ri
  • python - 分割字符串而不删除分隔符

    我试图在不删除分隔符的情况下拆分字符串 但这样做遇到了麻烦 我要分割的字符串是 9 4 3 2 我想结束 9 4 3 2 但我尝试过的一切都没有奏效 我正在通过这个 stackoverflow 帖子寻找答案以及谷歌 Python split
  • “word-wrap”css 属性中的“anywhere”是什么意思?

    我刚刚注意到在 Firefox 中 我认为在 Chrome 中也是一样 属性 word wrap 有一个名为 anywhere 的新属性值 它有什么作用 我记得使用正常 默认 或断词 对于大多数用途 但 任何地方 是什么意思 它与 破词 有
  • 如何在 Guice 中进行需要注入实例的动态绑定?

    我想创建一个将实例动态绑定到命名注释的模块 用例是我想自动将配置中的值与属性文件中的键绑定为 Named 值 但是 配置绑定在不同的模块中 因此我需要注入配置 我看过的解决方案是 绑定在configure 方法中 此方法未注入 我无法获取基
  • 触发 OnPropertyChanged 的​​更好方法

    我们有一个遵循 MVVM 模式的 WPF 项目 在视图模型中有很多代码 如下所示 private string m Fieldname public string Fieldname get return m Fieldname set m