从属性网格重置属性
我正在使用 PropertyGrid 显示对象的属性。 但是,我还允许用户创建自己的属性,并为这些自定义属性设置值。 每个可以具有这些自定义属性的对象都有一个 Dictionary 集合,其中字符串是标识属性的唯一键,而 Object 是基本类型(字符串、布尔、int 等)的值。
我创建了一个自定义PropertyDescriptor 具有 get 和 set 方法,用于检查字典中是否有匹配的键,或者分别使用匹配的键创建/覆盖值。
但是,我还想让用户能够清除该属性,从而从字典中完全删除其条目。 我将代码放入自定义 PropertyDescriptor 的 ResetValue 重写方法中,但是我没有看到任何通过 PropertyGrid 接口来调用它的方法? 它似乎不是上下文菜单选项或类似的明显选项。
因此,如果我有一个带有自定义 ResetValue 方法的自定义 PropertyDescriptor,那么如何从 PropertyGrid 中实际调用该方法呢?
I am using a PropertyGrid to show properties from my objects. However, I'm also allowing the user to create their own properties, and set values for these custom properties. Each object that can have these custom properties has a Dictionary collection, where the string is a unique key to identify the property, and Object is the value of a primitive type (string, bool, int etc..)
I've created a custom PropertyDescriptor with get and set methods that check the Dictionary for a matching key, or create/overwrite the value with a matching key respectively.
However, I also want to give the user the ability to clear the property, and thus remove its entry from the dictionary entirely. I'd put the code to to this in the ResetValue override method of my custom PropertyDescriptor, however I don't see any way through the PropertyGrid interface to envoke this? It doesn't seem to be a context menu option or something obvious like that.
So if I have a custom PropertyDescriptor with a custom ResetValue method, how do I actually evoke that method from a PropertyGrid?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我认为实现此目的的最简单方法是将上下文菜单添加到属性网格,其中包含菜单项“重置”,然后像这样处理其单击事件:
我认为 Visual Studio 会执行类似的操作。
I think the easiest way to achieve this is to add a contextmenu to your property grid, with a menu item "Reset", and then handling its click event like this:
I think Visual Studio does something like this.
注解:
PropertyGrid.SelectedObject 在子对象中返回错误的值(组件)。
因此,CanResetValue 方法收到了不正确的组件。
我的解决方案:
Annotation:
The PropertyGrid.SelectedObject returns the wrong Value (component) in Childobjects.
Consequently the Method CanResetValue recived a incorrect component.
My Solution:
对于子对象,对包含属性的对象的引用隐藏在
GridItem
类的非公共后代的Instance
属性中。 值得庆幸的是,此属性是这些后代类实现的 ITypeDescriptorContext 接口的成员。 因此,有一个解决方案,包括在所有属性的上下文菜单中正确启用“重置”命令:For child objects the reference to the object containing a property is hidden in the
Instance
property of the non-public descendants of theGridItem
class. Thankfully, this property is a member of theITypeDescriptorContext
interface which these descendant classes do implement. So, there is a solution that includes correct enabling of the Reset command in a context menu for all properties:这就是我用来重置我的属性的方法
这就是我使用它的方式:
信用: http://www.windows-tech.info/3/41955b2a405bf481.php
This is what i am using to reset my properties
And this is how i use it:
Credit: http://www.windows-tech.info/3/41955b2a405bf481.php