在WPF MVVM模式开发中,实现INotifyPropertyChanged的ViewModel是非常重要且常见的类:

public class MainViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}

在类里,需要响应变化的属性都需要在Setter里调用属性变化的方法:

private string _appName;
public string AppName
{
get
{
return _appName;
}
set
{
if (_appName == value)
return;
_appName = value;
OnPropertyChanged(nameof(AppName));
}
}

这样的写法,一个两个属性还好,在有很多属性的情况下,就显得有一些繁杂,今天要介绍一款开源的工具就是为了解决这个问题。

Fody/PropertyChanged

开源地址: https://github.com/Fody/PropertyChanged/

在编译时,在属性中实现 INotifyPropertyChanged 的代码

使用方法

  1. 通过Nuget安装

    PM> Install-Package PropertyChanged.Fody

  2. 安装完成后,会在项目中,添加FodyWeavers.xml文件,这是Fody的配置文件,详细可以参考 Fody

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

说明

项目中所有标记有[ImplementPropertyChanged]特性,或者实现了INotifyPropertyChanged的类,都将自动在其属性中实现通知相关的代码,除非属性被显示标记为不通知

  • 程序中的代码:
[ImplementPropertyChanged]
public class Person
{
public string GivenNames { get; set; }
public string FamilyName { get; set; } public string FullName
{
get
{
return string.Format("{0} {1}", GivenNames, FamilyName);
}
}
}

或者

public class MainViewModel : INotifyPropertyChanged
{ public string GivenNames { get; set; }
public string FamilyName { get; set; } public string FullName
{
get
{
return string.Format("{0} {1}", GivenNames, FamilyName);
}
} public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
  • 编译后对应的
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));
}
}
}

 

 
 

随机推荐

  1. jrebel实现tomcat热部署

    -noverify -javaagent:D:\jrebel.jar 注:频繁切换工程的时候,热部署可能会失效; 解决办法是:先把项目拖到tomcat下发布,然后在没有配置上面这行代码的情况下,让项目 ...

  2. MUI(3)

    本篇博文是继续上篇博文MUI(2).上面这幅图是博文MUI(1)中实现的效果,在博文MUI(1)中提到了2个页面,一个页面是index.html,另一个页面是index_list.html页面.上面这 ...

  3. notepad++下的字体设置

    设置 - 语言格式设置 中

  4. c++性能测试

    程序分析是以某种语言书写的程序为对象,对其内部的运作流程进行分析.程序分析的目的主要有三点:一是通过程序内部各个模块之间的调用关系,整体上把握程序的运行流程,从而更好地理解程序,从中汲取有价值的内容. ...

  5. Config IIS server6.0-- HTTP 错误 500.21 - Internal Server Error 解决方案

    HTTP 错误 500.21 - Internal Server Error 解决方案         不久前重新安装了Windows7,在安装了VS2010 开发平台之后,将网站发布到IIS,访问发 ...

  6. Codeforces 385C Bear and Prime Numbers

    题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...

  7. 增强型for语句与java,c#的不同之处,with语句的使用

    <script type="text/javascript" language="javascript"> //遍历数组 var arr = [&q ...

  8. 详解equals()方法和hashCode()方法

    前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...

  9. php字符串转数组

    下面代码包括了含有中文汉字的字符. function str2arr($str) { $length = mb_strlen($str, 'utf-8'); $array = []; for ($i= ...

  10. 初识Java框架

    Spring boot>spring>spring mvc SSH:struts2+spring+hibernate SSM(SSH的改进): (过去)spring+struts2+MyB ...