为了账号安全,请及时绑定邮箱和手机立即绑定

自动INotifyPropertyChanged

自动INotifyPropertyChanged

C#
青春有我 2019-12-12 14:10:17
有什么方法可以自动通知类中的属性更改,而不必在每个setter中编写OnPropertyChanged?(我想知道数百个属性是否已更改)。安东建议使用动态代理。过去,我实际上已经将“ Castle”库用于类似的东西,尽管它确实减少了我必须编写的代码量,但它使程序启动时间(ymmv)增加了约30秒-因为这是一个运行时解决方案。我想知道是否有一个编译时解决方案,也许使用编译时属性...Slashene和TcK给出了生成重复代码的建议-不幸的是,并非我的所有属性都是m_Value = value的简单情况-它们中的很多在setter中都有自定义代码,因此摘录和xml中的cookie-cutter代码对于我的项目
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

NotifyPropertyWeaver的作者已弃用该工具,而推荐使用更通用的Fody。(提供了从织布工转变为假肢的人员的迁移指南。)


我用于项目的一个非常方便的工具是Notify Property Weaver Fody。


它会在您的项目中作为构建步骤进行自身安装,并在编译过程中注入引发PropertyChanged事件的代码。


使属性提高PropertyChanged是通过在属性上放置特殊属性来完成的:


[ImplementPropertyChanged]

public string MyProperty { get; set; }

另外,您还可以为依赖于其他属性的属性指定关系


[ImplementPropertyChanged]

public double Radius { get; set; }


[DependsOn("Radius")]

public double Area 

{

    get { return Radius * Radius * Math.PI; }

}


查看完整回答
反对 回复 2019-12-12
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

Framework 4.5为我们提供了CallerMemberNameAttribute,从而无需将属性名称作为字符串传递:


private string m_myProperty;

public string MyProperty

{

    get { return m_myProperty; }

    set

    {

        m_myProperty = value;

        OnPropertyChanged();

    }

}


private void OnPropertyChanged([CallerMemberName] string propertyName = "none passed")

{

    // ... do stuff here ...

}

类似于Svish的解决方案,只是用无聊的框架功能替换了lambda令人敬畏的;-)


如果您正在使用安装了KB2468871的 Framework 4.0进行操作,则可以通过nuget来安装Microsoft BCL兼容性包,该包也提供了此属性。


查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 561 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信