RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 653558
Accepted
trydex
trydex
Asked:2020-04-14 14:32:28 +0000 UTC2020-04-14 14:32:28 +0000 UTC 2020-04-14 14:32:28 +0000 UTC

跟踪对象属性的变化

  • 772

有一个视图的集合ObservableCollection<BaseClass> Project {get;set;}。

任务如下:

如果对象的某些属性发生了变化,那么您需要通知用户项目已经发生变化并且需要保存。

除了如何在基类中实现之外,我没有想出任何其他方法INotifyPropertyChanged,但是有很多类,OnPropertyChanged将每个属性扩展为带有字段的属性是相当沉闷的。

有什么简洁的选择吗?

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    dm.dymov
    2020-04-14T16:38:56Z2020-04-14T16:38:56Z

    手动实施的替代方法INotifyPropertyChanged是使用片段或使用专用工具在编译期间将 IL 代码注入程序集。该领域公认的领导者是PostSharp,但是,当然,它是付费的。但是,有一个名为Fody的用于在编译时更改程序集的开源项目,其中一个附加项允许您只执行实现INF。顺便说一下,我建议您阅读 GitHub 页面上的 Fody 附加组件的完整列表,其中有很多有趣的东西。也可以自己写插件,开发方案不是很友好,但是例子很多(现成的插件也在GitHub上)。

    • 3
  2. klutch1991
    2020-04-14T14:47:16Z2020-04-14T14:47:16Z

    你可以尝试这样的事情:

    您创建一个集合,使用此方法的集合中的所有元素都必须实现INPC.

    ObservableCollection<INotifyPropertyChanged> items = 
                                  new ObservableCollection<INotifyPropertyChanged>();
    

    在集合中的更改事件上挂起处理程序:

    items.CollectionChanged += 
        new System.Collections.Specialized.NotifyCollectionChangedEventHandler(
                                                            items_CollectionChanged);
    

    在委托中,我们遍历旧/新元素并删除/添加对象中的属性更改处理程序:

    static void items_CollectionChanged(object sender, 
                   System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        foreach (INotifyPropertyChanged item in e.OldItems)
            item.PropertyChanged -= new 
                                   PropertyChangedEventHandler(item_PropertyChanged);
    
        foreach (INotifyPropertyChanged item in e.NewItems)
            item.PropertyChanged += 
                               new PropertyChangedEventHandler(item_PropertyChanged);
    }
    

    实际上,在这个方法里面,写通知代码:

    static void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        throw new NotImplementedException();
    }
    

    那么,包含在集合中的对象本身的每个属性都必须与INPC. 要在对象内更简洁和可读地实现属性,请使用第三方库,例如MVVM Light.

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5