广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#优雅的实现INotifyPropertyChanged接口
  • 493
分享到

C#优雅的实现INotifyPropertyChanged接口

2024-04-02 19:04:59 493人浏览 独家记忆
摘要

INotifyPropertyChanged接口在WPF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更。标准写法如下: class NotifyObject

INotifyPropertyChanged接口在WPF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更。标准写法如下:

    class NotifyObject : INotifyPropertyChanged
    {
        private int number;
        public int Number
        {
            get { return number; }
            set { number = value; OnPropertyChanged("Number"); }
        }

        private string text;
        public string Text
        {
            get { return text; }
            set { text = value; OnPropertyChanged("Text"); }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName = "")
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

这种写法的两个问题是

  • 对属性名使用了字符串硬编码,容易写错,也不方便重构
  • 冗余代码,如果属性较多的时候写得想吐

 我在博客文章使用CallerMemberName简化InotifyPropertyChanged的实现中介绍了通过Caller InfORMation解决属性名称字符串硬编码的问题。但是仍然不能解决冗余代码的问题。对于第二个问题,往往是通过aop的方式实现,一般的实现方式有两种:

  • 通过代理对象封装
  • 通过编译期间代码注入的方式实现

我增在项目中使用过DynamicObject封装来实现过,主要原理是用实现一个PocoNotifyWrapper的DynamicObject类,托管其属性的读写动作,并附加IntofyPropertyChanged接口实现。

这种方式是动态的AOP了,是一个通用的方式,并且扩展性比较器,可以通过继承PocoNotifyWrapper来实现多态。用它做ViewMode层还是比较方便。

不过一个不大好的地方是DynamicObject是丢失了属性类型信息的,有时绑定时会出错(如将一个TextBox的Text绑定到一个封装后的Int类型对象时会不进行自动类型转换)。要解决它还需要实现一些其它的接口,实现起来还是有些复杂的,并且项目进度比较紧张,没有太多时间来完善它。

另外一种方式是通过编译期间代码注入方式来实现:

最开始见的是PostSharp的一个实现: Http://doc.postsharp.net/inotifypropertychanged-add。不过PostSharp是收费的,后来也逐渐由了许多其它的免费的解决方案。本文这里介绍的是一个开源的解决方案:Fody。

使用它非常简单,首先通过Nuget安装库:PM> Install-Package PropertyChanged.Fody。然后在需要实现属性通知的类上加一个[ImplementPropertyChanged]即可:

  [ImplementPropertyChanged]
  public class Person
  {

    public string GivenNames { get; set; }
    public string FamilyName { get; set; }

    public string FullName => string.Format("{0} {1}", GivenNames, FamilyName);
  }

编译后生成的代码如下:

public class Person : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    string givenNames;
    public string GivenNames
    {
        get { return givenNames; }
        set
        {
            if (value != givenNames)
            {
                givenNames = value;
                OnPropertyChanged("GivenNames");
                OnPropertyChanged("FullName");
            }
        }
    }

    string familyName;
    public string FamilyName
    {
        get { return familyName; }
        set 
        {
            if (value != familyName)
            {
                familyName = value;
                OnPropertyChanged("FamilyName");
                OnPropertyChanged("FullName");
            }
        }
    }

    public string FullName
    {
        get
        {
            return string.Format("{0} {1}", GivenNames, FamilyName);
        }
    }

    public virtual void OnPropertyChanged(string propertyName)
    {
        var propertyChanged = PropertyChanged;
        if (propertyChanged != null)
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

基本上对代码没有注入,不需要安装插件,也不影响调试,实现非常简单,非常方便。

需要注意的是,如果实现了INotifyPropertyChanged接口,即使没有[ImplementPropertyChanged]标记,默认也会注入。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对编程网的支持。如果你想了解更多相关内容请查看下面相关链接

--结束END--

本文标题: C#优雅的实现INotifyPropertyChanged接口

本文链接: https://www.lsjlt.com/news/166179.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#优雅的实现INotifyPropertyChanged接口
    INotifyPropertyChanged接口在WPF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更。标准写法如下: class NotifyObject ...
    99+
    2022-11-13
  • C#的INotifyPropertyChanged接口怎么使用
    这篇文章主要介绍“C#的INotifyPropertyChanged接口怎么使用”,在日常操作中,相信很多人在C#的INotifyPropertyChanged接口怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-29
  • C#实现接口的实例
    这篇文章主要介绍“C#实现接口的实例”,在日常操作中,相信很多人在C#实现接口的实例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#实现接口的实例”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!C#实现接...
    99+
    2023-06-17
  • GO 语言中如何优雅地实现大数据的接口加载?
    随着大数据时代的到来,越来越多的企业开始关注数据的价值,而数据的处理和分析需要依托于高效的接口加载。GO 语言是一种高效的编程语言,而且它在网络编程方面也有着很高的性能表现。在这篇文章中,我们将探讨如何利用 GO 语言优雅地实现大数据的接...
    99+
    2023-06-17
    接口 load 大数据
  • C#接口重的实现示例
    这篇文章给大家介绍C#接口重的实现示例,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。派生类可以对基类中已经定义的成员方法进行重载。类似的概念引入到类对接口的实现中来,叫做接口的重实现(re-implementation...
    99+
    2023-06-17
  • Vuex中actions优雅处理接口请求的方法
    目录前言文件结构前言 在项目开发中,如果使用到了 vuex,通常我会将所有的接口请求单独用一个文件管理,而业务逻辑写在 actions 中,一方面方便统一管理项目中的所有请求,其次代...
    99+
    2022-11-16
    Vuex actions接口请求 Vuex接口请求 Vuex actions请求
  • 什么是接口?如何在PHP中使用接口编写优雅的代码?
    什么是接口?如何在PHP中使用接口?本篇文章带大家聊聊使用接口编写更优雅的 PHP 代码,希望对大家有所帮助!在编程中,确保代码可读、可维护、可扩展和易于测试是很重要的;而使用接口,恰恰是我们改进代码中所有这些因素的方法之一。目标读者本文的...
    99+
    2022-08-08
    php 接口
  • C#怎么实现InterfaceImplementer.cs接口
    这篇“C#怎么实现InterfaceImplementer.cs接口”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#怎么实...
    99+
    2023-06-17
  • Go编程算法中的接口详解:如何优雅地实现代码复用?
    Go语言作为一门高效的编程语言,其拥有着非常灵活的接口设计。这些接口不仅可以帮助我们优雅地实现代码复用,还可以让我们更好地组织代码结构,提高代码的可读性和可维护性。本文将深入探讨Go编程算法中的接口,以及如何优雅地实现代码复用。 接口是什...
    99+
    2023-10-23
    接口 教程 编程算法
  • C#串口接收程序的实现
    1.代码 using System; using System.Collections.Generic; using System.ComponentModel; using Sys...
    99+
    2022-11-13
  • C#怎么实现多个接口
    这篇文章主要讲解了“C#怎么实现多个接口”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#怎么实现多个接口”吧!学习C#语言时,经常会遇到C#实现多个接口问题,这里将介绍C#实现多个接口问题...
    99+
    2023-06-17
  • C#如何实现多个接口
    这篇文章主要介绍“C#如何实现多个接口”,在日常操作中,相信很多人在C#如何实现多个接口问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#如何实现多个接口”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!一个...
    99+
    2023-06-17
  • 怎样实现C#接口成员
    这篇文章给大家介绍怎样实现C#接口成员,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。为了实现C#接口,类可以定义显式接口成员执行体(Explicit interface memberimplementations)。显...
    99+
    2023-06-17
  • java实战小技巧之优雅的实现字符串拼接
    目录前言String底层原理1. 普通写法2. StringJoiner3. guava joiner4. 小结总结前言 字符串拼接不管是在业务上,还是写算法时都会频繁使用到。 相信...
    99+
    2022-11-12
  • C#8.0默认接口实现的详细实例
    Intro C# 8.0 开始引入了默认接口实现,也就是可以在接口里写方法实现。 在之前的版本中接口上是没有办法定义实现的,方法也都是 public 的,除了接口和属性之外是不能定...
    99+
    2022-11-12
  • C#多线程实现异步接口
    异步接口的声明 我们已经了解到,如果一个方法是异步的,那么这个方法的返回值类型是Task<T>,那么接口中该如何规定异步方法呢? 一样的,如果接口中的方法是异步的,那么规...
    99+
    2022-11-13
  • C#接口怎么声明和实现
    这篇文章主要讲解了“C#接口怎么声明和实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#接口怎么声明和实现”吧!学习C#接口:声明接口声明接口在语法上和声明抽象类完全相同,例如这里有一个...
    99+
    2023-06-18
  • C#覆盖虚接口怎么实现
    本篇内容主要讲解“C#覆盖虚接口怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#覆盖虚接口怎么实现”吧!有时候我们需要表达一种抽象的东西,它是一些东西的概括,但我们又不能真正的看到它成...
    99+
    2023-06-17
  • C++中怎么实现一个接口
    C++中怎么实现一个接口,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。定理1:C++接口是依赖的终点。接口不需要依赖任何东西。推论1:依赖C++接口是安全的。不会带来更多的...
    99+
    2023-06-17
  • C#中怎么实现多个接口
    今天就跟大家聊聊有关C#中怎么实现多个接口,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。为了C#实现多个接口,我们可以从接口派生类。这样的派生类必须为所有接口的方法提供实现,除非派生...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作