WPF 中 PropertyChanged.Fody 的使用

383 阅读4分钟

前言

现在基本上每一个项目都会使用PropertyChanged.Fody,用了以后,代码确实简洁清爽了很多。

安装

Install-Package PropertyChanged.Fody

继承INotifyPropertyChanged接口

安装了PropertyChanged.Fody以后,默认会为带INotifyPropertyChanged接口的类里面的属性都加上变更通知功能。

public class Person : INotifyPropertyChanged
{
   [AlsoNotifyFor("FullName")]
   public string GivenName { get; set; }

   [AlsoNotifyFor("FullName")]
   public string FamilyName { get; set; }

   public event PropertyChangedEventHandler PropertyChanged;

   public string FullName { get; set; }
}

因为我平常开发的时候基本上都会使用Prism,所以一般我会把类定义下继承Prism的BindableBase类,如下:

public class Person : BindableBase
{
   [AlsoNotifyFor("FullName")]
   public string GivenName { get; set; }

   [AlsoNotifyFor("FullName")]
   public string FamilyName { get; set; }

public string FullName { get; set; }
}

因为BindableBase类会实现INotifyPropertyChanged接口。

ImplementPropertyChanged

也通过给没有INotifyPropertyChanged接口的类,增加ImplementPropertyChanged附加属性来实现通知的功能。但好像不推荐,官方推荐用上面的方式。

[ImplementPropertyChanged]
public class Person 
{
    public string Name { get; set; }
}

DoNotNotify

不希望通知的属性可以加上[DoNotNotify]的附加属性。

public class Person : INotifyPropertyChanged
{
   public string GivenName { get; set; }
   [DoNotNotify]
   public string FamilyName { get; set; }
   public event PropertyChangedEventHandler PropertyChanged;
}

AlsoNotifyFor

如果想要某个属性变化了以后,同时通知其它属性,可以添加AlsoNotifyFor附加属性。

public class Person : INotifyPropertyChanged
{
   [AlsoNotifyFor("FullName")]
   public string GivenName { get; set; }

   [AlsoNotifyFor("FullName")]
   public string FamilyName { get; set; }

   public event PropertyChangedEventHandler PropertyChanged;

   public string FullName { get; set; }
}

在GivenName或FamilyName变化时,会同时也通知FullName的变化。

DependsOn

如果属性之间有联动的,也可以通过添加DependsOn附加属性来实现同步通知的功能。

public class Person : INotifyPropertyChanged
{
    public string GivenName { get; set; }

    public string FamilyName { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    [DependsOn("GivenName","FamilyName")]
    public string FullName { get; set; }
}

这样只要GivenName和FamilyName属性发生变化了,也会通知界面FullName属性变更了。

当然也可以使用下面的nameof的方式。

public class Person : INotifyPropertyChanged
{
    public string GivenName { get; set; }

    public string FamilyName { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    [DependsOn(nameof(GivenName), nameof(FamilyName))]
    public string FullName { get; set; }
}

IsChanged

如果类里面添加了IsChanged属性,但只要类里的属性有变化,IsChanged会自动被设为true。

public class Person: INotifyPropertyChanged
{
    public string FullName { get; set; }
    public bool IsChanged { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
}

DoNotSetChanged

如果希望某个属性变化的时候,不修改IsChanged的值,可以添加DoNotSetChanged的附加属性。

public class Person: INotifyPropertyChanged
{
    public string GivenName { get; set; }

    public string FamilyName { get; set; }

    [DoNotSetChanged]
    public string FullName { get; set; }
    public bool IsChanged { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
}

上面的代码,GivenName和FamilyName属性发生变化时,IsChanged的值会变为true。FullName属性变化时,IsChanged的值不会变。

DoNotCheckEquality

默认情况下,变化响应会先检查是否相等,如果相等,则不会进行通知。

如果需要不管相等不相等,都进行变更通知。则可以加上DoNotCheckEquality附加属性。

public class Person: INotifyPropertyChanged
{
   [DoNotCheckEquality]
   public string FullName { get; set; }
   public bool IsChanged { get; set; }

   public event PropertyChangedEventHandler PropertyChanged;
}

这样,在给FullName赋值时,无论是否和之前的值相等,都会进行通知。

常见问题

编译时提示【Fody: The package reference for PropertyChanged.Fody does not contain PrivateAssets='All'】的错误

这个报错是指在使用Fody和PropertyChanged.Fody库时,包引用中缺少PrivateAssets='All'的设置。

为了解决这个问题,可以按照以下步骤进行操作:

1、打开你的项目文件(例如.csproj文件)。

2、找到对应的<PackageReference>元素,它指向PropertyChanged.Fody库。

3、 在该元素内部添加<PrivateAssets>all</PrivateAssets>,确保设置正确。

<PackageReference Include="PropertyChanged.Fody">
  <PrivateAssets>all</PrivateAssets>
</PackageReference>

4、保存并关闭项目文件。

5、重新构建项目,检查报错是否解决。

通过添加<PrivateAssets>all</PrivateAssets>设置,你告诉MSBuild在构建项目时不包含这个包引用的任何私有资产。

这可以防止这个包被传递到依赖项中,并解决了PrivateAssets='All'的缺失导致的报错。

如果问题仍然存在,可能需要检查Fody和PropertyChanged.Fody库的版本兼容性,并确保它们与你的项目和其他依赖项兼容。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:wzwyc

出处:cnblogs.com/wzwyc/p/17550513.html

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!