C# 用Fody实现Winform下的MVVM

摘要


Fody是一个用于C#项目的代码增强工具。它通过IL(Intermediate Language)重写技术,允许您在编译期间修改程序集的IL代码,以实现各种功能,如属性更改通知、自动实现接口、自动属性注入等。Fody使用插件方式工作,每个插件都可以用于特定的需求。

正文


要使用Fody,首先需要在您的C#项目中安装Fody NuGet包。在Visual Studio中,可以通过NuGet包管理器来执行此操作。打开项目,然后执行以下步骤:

  1. 在“解决方案资源管理器”中,右键单击项目,选择“管理NuGet程序包”。
  2. 在NuGet包管理器中,搜索并安装Fody包。
  3. 安装PropertyChanged.Fody包

 

新建一个Person类

public class Person: INotifyPropertyChanged{    public string Name { get; set; }
    public int Age { get; set; }
    public event PropertyChangedEventHandler? PropertyChanged;}

 

public partial class Form1 : Form{    Person person = new Person();    public Form1()    {        InitializeComponent();        person.PropertyChanged += Person_PropertyChanged;    }
    private void btnProperty_Click(object sender, EventArgs e)    {        person.Name = "Test";        person.Age = 100;    }
    private void Person_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)    {        switch (e.PropertyName)        {            case "Name":                MessageBox.Show((sender as Person).Name);                break;            case "Age":                MessageBox.Show((sender as Person).Age.ToString());                break;            default:                break;        }    }}

特性

我们需要针对某些特殊需求进行调整,比如更新A属性同时保留B属性,或者需要禁止通知某些属性等等。在这种情况下,Fody提供了特殊的标记属性功能,让我们能够轻松实现这些需求。

AlsoNotifyForAttribute(允许注入指向不同属性的通知)

public class Person: INotifyPropertyChanged{    [AlsoNotifyFor("Name")]    public string FirstName { get; set; } //当FirstName或LastName改变时,通知Name 
    [AlsoNotifyFor("Name")]    public string LastName { get; set; }    public string Name { get; set; }
    public int Age { get; set; }
    public event PropertyChangedEventHandler? PropertyChanged;}
 

DoNotNotifyAttribute(不通知)

public class Person: INotifyPropertyChanged{    [AlsoNotifyFor("Name")]    public string FirstName { get; set; } //当FirstName或LastName改变时,通知Name 
    [AlsoNotifyFor("Name")]    public string LastName { get; set; }    public string Name { get; set; }
    public int Age { get; set; }
    [DoNotNotify]    public string Department { get; set; } //不通知
    public event PropertyChangedEventHandler? PropertyChanged;}


一个例子

public partial class Form1 : Form{    Person person = new Person();    public Form1()    {        InitializeComponent();        BindData();    }
    private void btnProperty_Click(object sender, EventArgs e)    {        person.Name = "张三";        person.Age = 123;    }
    //绑定属性    private void BindData()    {        txtName.DataBindings.Add("Text", person, "Name", false, DataSourceUpdateMode.OnPropertyChanged);        txtAge.DataBindings.Add("Text", person, "Age", false, DataSourceUpdateMode.OnPropertyChanged);    }}

 

再修改一下Person类,发现功能依旧有效

[AddINotifyPropertyChangedInterface]public class Person{    [AlsoNotifyFor("Name")]    public string FirstName { get; set; } //当FirstName或LastName改变时,通知Name 
    [AlsoNotifyFor("Name")]    public string LastName { get; set; }    public string Name { get; set; }
    public int Age { get; set; }
    [DoNotNotify]    public string Department { get; set; } //不通知}

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/82423.html

(0)
guozi's avatarguozi
上一篇 2024年5月31日 下午3:48
下一篇 2024年5月31日 下午3:50

相关推荐

  • 如何选择适合自己的200g高防服务器?

    在当今互联网时代,随着网络攻击的不断增多,保护服务器的安全性变得愈加重要。而200g高防服务器作为一种专门针对网络攻击的防御型服务器,备受企业和个人用户的青睐。但是面对市场上琳琅满…

    行业资讯 2024年3月20日
    0
  • Gitlab容器化部署

    上一篇讲了Git的操作和管理,我们在Github上也试着进行了Git的操作以及Git仓库的管理。但是我们很多的工作不方便公布到Github上,那如何搭建自己的Git远程服务给自己或…

    2024年4月2日
    0
  • android:App卡顿的根本原因

    为啥是 16ms 呢?系统是怎么保证的呢? Android 的显示过程可以简单概括为:应用层负责绘制,系统层负责渲染。应用层把经过测量、布局、绘制后的 surface 缓存数据,通…

    行业资讯 2024年5月30日
    0
  • 网站被移动屏蔽了,网站被移动屏蔽怎么办

    另一个可能的原因是网站加载速度太慢。在移动设备上,用户会关注网页的加载速度,如果等待时间太长,可能会放弃您的网站。搜索引擎会优先考虑加载速度快的网页,因此缓慢的页面速度会影响您的S…

    行业资讯 2024年5月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注