如何避免手动实现 INotifyPropertyChanged
有什么办法可以避免这种情况吗?我有很多绑定到 DataGridViews 的类,它们只是具有默认 getter 和 setter 的属性的简单集合。所以这些类非常简单。现在我需要为它们实现 INotifyPropertyChanged 接口,这会增加很多代码量。 我可以继承任何类来避免编写所有这些无聊的代码吗?我想象我可以从某个类继承我的类,并用一些属性来装饰属性,它会发挥魔力。这可能吗?
我很了解面向方面的编程,但我宁愿以面向对象的方式进行。
Is there some way to avoid this. I have a lot of classes that are bound to DataGridViews and they are just simple collection of properties with default getter and setter. So these classes are very simple. Now I need to implement INotifyPropertyChanged interface for them which will increase the amount of code a lot.
Is there any class that I can inherit from to avoid writing all this boring code? I image that I can inherit my classes from some class and decorate the properties with some attributes and it will do the magic. Is that possible?
I'm well aware of Aspect Oriented Programming, but I'd rather do it object oriented way.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
我刚刚找到了 ActiveSharp - 自动 INotifyPropertyChanged,我还没有使用它,但它看起来不错。
引用它的网站...
相反,应像这样编写属性:
请注意,无需将属性名称包含为字符串。 ActiveSharp 能够可靠且正确地自行解决这一问题。它的工作原理是您的属性实现通过 ref 传递支持字段 (_foo)。 (ActiveSharp 使用“by ref”调用来识别传递了哪个支持字段,并从该字段中识别属性)。
I have just found ActiveSharp - Automatic INotifyPropertyChanged, I have yet to use it, but it looks good.
To quote from it's web site...
Instead, write properties like this:
Note that there is no need to include the name of the property as a string. ActiveSharp reliably and correctly figures that out for itself. It works based on the fact that your property implementation passes the backing field (_foo) by ref. (ActiveSharp uses that "by ref" call to identify which backing field was passed, and from the field it identifies the property).
对 leepie 的改进。
values
字典中没有此类元素的情况(这会导致KeyNotFoundException)
避免传递属性的名称
(使用CallerMemberName
属性)(["name"])
。用法:
代码:
来自:devto
那里也有基准。
improvements on leepie.
values
dictionary (which results in aKeyNotFoundException)
avoid passing the name
of the property ( usingCallerMemberName
attribute )(["name"])
.usage:
code:
from : devto
there is also benchmark in there.
这取决于;您可以使用 PostSharp 来编写这样一个由重写的属性织工;但是,我很想手动执行此操作 - 也许使用通用方法来处理数据更新,即
:
It depends; you could use PostSharp to write such an attribute that is re-written by the weaver; however, I would be tempted to just do it manually - perhaps using a common method for handling the data updates, i.e.
with:
创建容器基类,例如:
注意:非常简化的代码
Create a container base class, eg:
Note: very simplified code
如果没有 AOP,我认为没有一种简单的方法可以将其改造为现有的类。不管你怎么做,你至少都必须改变你的所有属性。
我使用继承 INotifyPropertyChanged 的基类和 OnPropertyChanged(string propertyName) 方法来触发该事件。然后,我使用 Visual Studio 代码片段创建在属性设置器中自动调用 OnPropertyChanged 的属性。
Without AOP, I don't think there is an easy way to retrofit this to your existing classes. However you do it, you're at the very least going to have to change all your properties.
I use a base class inheriting INotifyPropertyChanged with an OnPropertyChanged(string propertyName) method to fire the event. I then use a Visual Studio Code snippet to create properties that automatically call OnPropertyChanged in the property setter.
这是与 Marc 类似的解决方案,已扩展为允许多个属性 onpropertychanges 和多个 RaiseCanExecuteChanged
最简单的示例用法
使用多个属性更新和多个命令的高级示例
高级示例在名字和全名上调用 OnProperty 更改,还为 command1 和 command2 调用 RaiseCanExecuteChanged
基本 ViewModel 代码
Here is a similar solution to Marc, that has been extended to allow multiple property onpropertychanges and multiple RaiseCanExecuteChanged
simplest example usage
advanced example using multiple property updates and multiple commands
The advanced example calls OnProperty changed on firstname and fullname and also calls RaiseCanExecuteChanged for command1 and command2
base ViewModel code
如果您愿意使用 AOP,您可以尝试使用 PostSharp。搜索 PostSharp INotifyPropertyChanged,您会发现很多解释它的文章,例如 这个和这个。
If you're amenable to AOP, you could try using PostSharp. Search for PostSharp INotifyPropertyChanged and you'll find lots of articles explaining it, such as this and this.
使用代码生成(例如,T4)是另一种方法。查看讨论:通过 T4 代码生成自动 INotifyPropertyChanged 实现?。
我用这个方法,效果很好。
Using code gen (say, T4) is another way. Check the discussion at: Automatic INotifyPropertyChanged Implementation through T4 code generation?.
I use this method, and it works well.