自动INotifyPropertyChanged

有什么方法可以自动通知类中的属性更改,而不必在每个setter中编写OnPropertyChanged?(我想知道数百个属性是否已更改)。


安东建议使用动态代理。过去,我实际上已经将“ Castle”库用于类似的东西,尽管它确实减少了我必须编写的代码量,但它使程序启动时间(ymmv)增加了约30秒-因为这是一个运行时解决方案。


我想知道是否有一个编译时解决方案,也许使用编译时属性...


Slashene和TcK给出了生成重复代码的建议-不幸的是,并非我的所有属性都是m_Value = value的简单情况-它们中的很多在setter中都有自定义代码,因此摘录和xml中的cookie-cutter代码对于我的项目


青春有我
浏览 565回答 3
3回答

有只小跳蛙

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; }}

潇潇雨雨

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兼容性包,该包也提供了此属性。
打开App,查看更多内容
随时随地看视频慕课网APP