WPF插件之 - PropertyChanged.Fody插件的使用详解

这篇具有很好参考价值的文章主要介绍了WPF插件之 - PropertyChanged.Fody插件的使用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

总目录



一、PropertyChanged.Fody是什么?

  • PropertyChanged.Fody 主要是实现了INotifyPropertyChanged 接口的,然后通过特性对外提供相关属性通知功能。
  • 引用该插件能够使我们属性通知的代码更为简洁。
  • 源码:https://github.com/Fody/PropertyChanged

如在阅读本文后,后续遇到文中没有提及的问题或知识点,可以查看源码说明文档

二、PropertyChanged.Fody的安装

1.首先添加PropertyChanged.Fody的Nuget程序包

WPF插件之 - PropertyChanged.Fody插件的使用详解
如果通过程序包管理器控制台安装,则如下操作

  • 先调出控制台,然后根据需求修改程序包源和需要安装程序包的项目
    WPF插件之 - PropertyChanged.Fody插件的使用详解
  • 输入程序包的安装命令,即可完成程序包的安装
PM> Install-Package Fody
PM> Install-Package PropertyChanged.Fody

2.再者添加FodyWeavers.xml 文件

一般安装完PropertyChanged.Fody程序包后,会自动创建FodyWeavers.xml 文件;如果没有自动创建FodyWeavers.xml 文件,此时我们可以重新生成项目,然后项目生成时会自动在项目根目录下创建FodyWeavers.xml 文件,此时还没有包括在项目中,我们需要先显示所有文件,然后将FodyWeavers.xml 文件包含在项目中即可。如果以上操作均没有生成FodyWeavers.xml 文件,则自行在项目中创建FodyWeavers.xml 文件,然后在文件中,配置如下代码:

<Weavers>
  <PropertyChanged/>
</Weavers>

三、PropertyChanged.Fody的功能

当我们介绍完安装完程序包后,下面就需介绍如何使用该程序包中提供的功能。

1. 特性

PropertyChanged.Fody的核心功能就是提供了一系列的特性供我们使用,通过给属性和类上标注特性,是我们的代码更加的简洁

1 实现属性通知的功能

通常我们自己手动实现INotifyPropertyChanged接口后,会需要将我们自己的ViewModel继承自实现类,然后在属性中调用方法来实现属性通知。如下示例中,ViewModelBase为自行实现INotifyPropertyChanged接口的实现类:

    public class MainViewModel:ViewModelBase
    {
        private double _num;
        public double Num
        {
            get { return _num; }
            set { _num = value; OnPropertyChanged(); }
        }
    }

当我们使用了PropertyChanged.Fody插件后,可通过以下方式来实现一样的功能

  • 方式1:直接将ViewModel的类继承自INotifyPropertyChanged类,所有实现INotifyPropertyChanged的类都将向属性设置器注入通知代码
  • 方式2:在ViewModel的类上添加AddINotifyPropertyChangedInterface特性,旧版是添加ImplementPropertyChanged 特性,但该特性已弃用

方式1 示例代码:

    public class MainViewModel : INotifyPropertyChanged
    {
        public double Num { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;
    }

方式2示例代码:

    [AddINotifyPropertyChangedInterface]
    public class MainViewModel
    {
        public double Num { get; set; }
    }

以上两种方式作用是一样的,都可以实现属性通知,并且还可以使我们属性通知的代码量大大的减少,编码界面更为简洁清晰。

通过下图了解一下通过以上方式,实现属性通知后的反编译代码
WPF插件之 - PropertyChanged.Fody插件的使用详解

下面我们通过一个完整的案例了解一下具体的使用,案例中实现Num1+Num2=Total:
WPF插件之 - PropertyChanged.Fody插件的使用详解

WPF插件之 - PropertyChanged.Fody插件的使用详解
反编译后的代码:
WPF插件之 - PropertyChanged.Fody插件的使用详解
通过以上案例我们知道:

  • 当我们在添加AddINotifyPropertyChangedInterface特性的类中,A属性引用了B和C属性,那么B和C属性代码中就会插入通知A属性更新的代码;如上面的案例中,Total属性中引用了Num1和Num2,反编译后Num1和Num2的属性访问器中就会添加<>OnPropertyChanged(<>PropertyChangedEventArgs.Total); 这样的一句代码,表示Num1和Num2属性更新后,不仅会通知自身,还会通知Total。
  • 当属性中有了业务逻辑代码,则不会插入属性更新的代码,如上案例Total属性的get访问器中有了业务代码,那么Total将不具有属性更新通知的功能

注意:只有在类上标注AddINotifyPropertyChangedInterface特性或者实现INotifyPropertyChanged接口后,PropertyChanged.Fody中其他的特性才能生效,否则其他特性单独使用是无效的。

2 通知其他属性

通过AlsoNotifyFor特性,我们可以实现在通知自身属性的时候,通知其他的属性进行更新;
实现原理:也仅仅是使用了该特性后,set访问器中会自动插入对应属性的属性通知代码

通过下图的源代码和反编译代码对比图可以加以佐证:WPF插件之 - PropertyChanged.Fody插件的使用详解
另外建议使用nameof去配置需要 另外通知的属性名,不容易出现低级错误;再者可以通过逗号配置多个需要另外通知的属性。

    [AddINotifyPropertyChangedInterface]
    public class MainViewModel
    {
        [AlsoNotifyFor(nameof(Total),nameof(Num2))]
        public double Num1 { get; set; }
        public double Num2 { get; set; }
        public double Total { get; set; }
    }

4 不进行属性通知

如果ViewModel中的某一些属性,我们并不希望其具有属性通知的功能,可以使用DoNotNotify特性。
WPF插件之 - PropertyChanged.Fody插件的使用详解

    [AddINotifyPropertyChangedInterface]
    public class MainViewModel
    {
        [DoNotNotify]
        public double Num1 { get; set; }
        public double Num2 { get; set; }
        public double Total { get; set; }
    }

3 指定属性更改时将调用的方法

默认情况下:如果有一个属性为Num,有一个方法为 OnNumChanged方法,那么在Num属性值更新的时候,就会执行OnNumChanged方法,只要是方法符合以上命名规则,就会自动生成调用代码。
WPF插件之 - PropertyChanged.Fody插件的使用详解

    [AddINotifyPropertyChangedInterface]
    public class MainViewModel
    {
    	//在Num1更新时,自动调用OnNum1Changed方法
        public double Num1 { get; set; }
        public double Num2 { get; set; }

        public double Total { get; set; }

        private void OnNum1Changed()
        {
            Total = Num1 + Num2;
        }
    }

但是,如果我们向明确的指定属性更改时需要调用的方法,则需通过OnChangedMethod特性。

通过下图了解OnChangedMethod特性的原理,原理很简单就是在set访问器中调用特性中配置的方法。
WPF插件之 - PropertyChanged.Fody插件的使用详解

    [AddINotifyPropertyChangedInterface]
    public class MainViewModel
    {
        [OnChangedMethod(nameof(OnNumChanged))]
        public double Num1 { get; set; }

        [OnChangedMethod(nameof(OnNumChanged))]
        public double Num2 { get; set; }
        public double Total { get; set; }

        private void OnNumChanged()
        {
            Total = Num1 + Num2;
        }
    }

以上案例表示当Num1和Num2 更新的时候,就执行OnNumChanged这个方法计算数字和。

5 设置当前属性依赖的属性

我们知道当我们给属性添加了AlsoNotifyFor特性的时候,可以实现在通知自身属性的时候,通知其他的属性进行更新;但是如果多个属性都通过AlsoNotifyFor指向的是同一个属性的时候,逐个添加不免有些麻烦;此时我们就可以使用DependsOn 特性,统一在最终指向的属性上,设置其依赖的属性即可。

WPF插件之 - PropertyChanged.Fody插件的使用详解

    [AddINotifyPropertyChangedInterface]
    public class MainViewModel
    {
        public double Num1 { get; set; }
        public double Num2 { get; set; }

        [DependsOn(nameof(Num1),nameof(Num2))]
        public double Total { get; set; }
    }

6 不检查是否相等

默认情况下,所有属性通知中都会检查属性值是否相等,如果属性值相等,则不会进行通知;原理代码如下:

public string Property1
{
    get
    {
        return property1;
    }
    set
    {
        if (!String.Equals(property1, value))
        {
            property1 = value;
            OnPropertyChanged("Property1");
        }
    }
}

但在某些情况下,我们需要无论是否相等都会进行通知,这个时候,可以在属性上标记DoNotCheckEquality特性以跳过是否相等的检查。
WPF插件之 - PropertyChanged.Fody插件的使用详解

    [AddINotifyPropertyChangedInterface]
    public class MainViewModel
    {
        [DoNotCheckEquality]
        public double Num1 { get; set; }
        public double Num2 { get; set; }
        public double Total { get; set; }

    }

当我们给属性加上DoNotCheckEquality特性的时候,就相当于给去掉了Object.Equals() 这个判断。

7 DoNotSetChangedAttribute

如果在添加了AddINotifyPropertyChangedInterface特性或者实现INotifyPropertyChanged接口的实现类中,有一个属性是IsChanged属性,那么默认情况下,当前类中的所有属性只要发生变化,都会将IsChanged 的属性值设置为True;

public bool IsChanged { get; set; }

如果希望在某个属性变化时,不设置IsChanged的属性值,可以给属性添加DoNotSetChanged特性,如下所示:

    [AddINotifyPropertyChangedInterface]
    public class MainViewModel
    {
        public bool IsChanged { get; set; }
        public double Num1 { get; set; }
        public double Num2 { get; set; }

        [DoNotSetChanged]
        public double Total { get; set; }
    }

WPF插件之 - PropertyChanged.Fody插件的使用详解

2. 配置FodyWeavers.xml文件

1 EventInvokerNames

该配置用于更改激发属性通知事件的方法名称,这是一个以逗号分隔形式接受多个值的字符串。默认值为:

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <PropertyChanged EventInvokerNames="OnPropertyChanged, NotifyOfPropertyChange, RaisePropertyChanged, NotifyPropertyChanged, NotifyChanged"/>
</Weavers>

默认值覆盖了WPF中大多数的MVVM框架对于激发通知事件的方法命名,如Prism和MVVMLight 框架中使用的是RaisePropertyChanged,Caliburn Micro中使用的是NotifyOfPropertyChange。

如果需要指定激发属性通知事件方法的名称,则如下指定即可。(基本是使用默认配置的,因为默认值已经覆盖大多数的框架。)

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <PropertyChanged EventInvokerNames="NotifyPropertyChanged"/>
</Weavers>

2 InjectOnPropertyNameChanged

用于控制是否启用On_PropertyName_Changed功能。默认值为true,启用该功能。

On_PropertyName_Changed 的功能就是:属性更改时执行对应名称的方法(如Num对应的OnNumChanged)以及OnChangedMethod特性所实现的功能

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <PropertyChanged InjectOnPropertyNameChanged='false'/>
</Weavers>

3 CheckForEquality

用于控制是否应创建相等检查。如果为false,将对项目禁用相等检查。默认值为true,创建相等检查

<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
  <PropertyChanged CheckForEquality='false'/>
</Weavers>

结语

以上就是本文的内容,希望以上内容可以帮助到您,如文中有不对之处,还请批评指正。文章来源地址https://www.toymoban.com/news/detail-446230.html

到了这里,关于WPF插件之 - PropertyChanged.Fody插件的使用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Maven】打包插件使用详解

    本文参照官网:http://maven.apache.org/plugins 一.常用Maven打包插件: 1.spring-boot-maven-plugin:这个插件是springboot的maven插件,能够将springboot项目打包为可执行的jar/war,官网文档。 2.maven-assembly-plugin: 这个插件是maven结构定制化的打包,maven中针对打包任务而提供的标准插件,包含了以下几个插

    2024年02月13日
    浏览(22)
  • IL编织器 --- Fody

    这个项目的名称“Fody”来源于属于织巢鸟科(Ploceidae)的小鸟(Fody),本身意义为编织。 核心Fody引擎的代码库地址 :https://github.com/Fody/Fody Github上是这样介绍的: Fody 是一个用于织制 .NET 程序集的可扩展工具。它允许在构建过程中作为一部分来操纵程序集的中间语言(IL)

    2024年02月08日
    浏览(22)
  • RabbitMQ Stream插件使用详解

    2.4版为RabbitMQ流插件引入了对RabbitMQStream插件Java客户端的初始支持。 RabbitStreamTemplate StreamListener容器 将spring rabbit流依赖项添加到项目中: 您可以使用RabbitAdmin bean,使用QueueBuilder.stream()方法指定队列类型,正常地配置队列。例如: 然而,这仅在您还使用non-stream 组件(如

    2024年04月27日
    浏览(17)
  • WPF 插件HelixToolkit库实现3D显示

    文章目录 前言 一、HelixToolkit安装 二、使用步骤 1.引入库 2.xmal代码设置         3.后端程序         4.3D显示 总结 3D显示、旋转、部件移动(位置获取) 开发一个可导入.stl文件,可视化3D显示模型,部件之间鼠标移动、键盘设置位置等。 WPF开发库HelixToolkit 引入库命名

    2024年02月12日
    浏览(23)
  • AI绘画:Roop插件的使用详解!

    roop插件有哪些特性,如果安装,已经在上一篇讲的非常详细了。不知道你们装得怎么样了? 今天,来详细的说一说roop插件的使用。 首先呢启动我们的Stable-Diffusion-WebUI,然后确保插件已经启用! 选择好模型,查看插件情况,一切准备就绪就可以进入下一步。 Roop的插件使用

    2024年02月11日
    浏览(31)
  • Python的PyHook3插件使用详解

    2024年02月14日
    浏览(14)
  • 详解Python生成二维码插件QrCode的使用

    二维码(QR Code)是一种常见的矩阵型条码,被广泛用于扫码支付、产品标识、活动推广等领域。Python提供了许多第三方库用于生成和解析二维码,其中最常用的是qrcode库。本文将介绍如何使用qrcode库来生成二维码,并提供相应的代码示例和详细说明。 在开始之前,我们需要

    2024年02月16日
    浏览(39)
  • 使用Unity Localization插件进行项目本地化实战详解

    在使用Unity开发游戏的过程中,本地化是必不可少的。网络上也有很多的本地化工具,本次我介绍的是Unity官方提供的Localization插件,大家可以在Package Manager进行安装 在Project Setting中找到Localization,(需要先创建这个Localization Setting文件)点击Locale Generator选择需要本地化的语

    2024年02月05日
    浏览(42)
  • 分布式测试插件 pytest-xdist 使用详解

    目录 使用背景: 使用前提: 使用快速入门: 使用小结: 大型测试套件:当你的测试套件非常庞大,包含了大量的测试用例时,pytest-xdist可以通过并行执行来加速整体的测试过程。它利用多个进程或计算机的计算资源,可以显著减少测试执行的时间。 高计算资源需求:某些

    2024年02月13日
    浏览(24)
  • MybatisPlus 超好用的idea代码生成插件,及使用详解

    文章目录 前言 一、MybatisPlus简介 二、MybatisPlus 代码生成插件 1.插件安装与配置 2.生成代码结构、内容展示 3.表新增字段,重新生成实体类覆盖  总结 新需求来了,又添加了好几张表,总不能手写或者复制之前的代码,再一通修改吧?! 一张表需要添加好几个新字段,往实体

    2024年01月24日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包