C#:更新时 PropertyGrid 不调用属性`Get`方法
Posted
技术标签:
【中文标题】C#:更新时 PropertyGrid 不调用属性`Get`方法【英文标题】:C#: Property `Get` method not being called by PropertyGrid when updated 【发布时间】:2018-02-15 13:26:14 【问题描述】:我已经被这个问题困住了一段时间,我似乎无法弄清楚我在哪里出错了。我有一个类UnitInfo
有几个属性,用于在winform 中填充PropertyGrid
。属性:
public class UnitInfo
public byte[] data get; set; = new byte[5];
public int serialNumber
get
return (int)data[0] & 0b0111_1111;
set
data[0] = (byte)(((int)data[0] & 0b1000_0000) | (int)value);
.
.
.
其余属性类似。当我在PropertyGrid
中更新除data
之外的任何属性时,对data
的更改会立即显示。例如,如果我通过在PropertyGrid
中手动输入一个值来更改序列号,那么data
将相应地更新。然而,反之亦然。如果我修改PropertyGrid
中的data
以更改serialNumber
的值,那么data
将更新但serialNumber
不会。
通过阅读文档,我对PropertyGrid
的理解可能是错误的,但是当更改一个属性时,不应该调用所有属性的Get
方法吗?当任何属性修改 data
时似乎会发生这种情况。
为什么修改data
后属性不更新?
【问题讨论】:
这个问题非常不清楚。请编辑您的问题,将类的名称和字节数组属性更改为不同的名称,以便我们弄清楚您在说什么。 @MarkBenningfield 对此感到抱歉,我修改了名称以使其(希望)更清晰。 你永远不会更新data
。永远不会调用数据的 set
方法。您只是更改该字节数组的状态,属性永远不会改变,它始终保持相同的 5 个字节(只是具有不同的值)。
【参考方案1】:
您应该使用RefreshPropertiesAttribute
装饰属性以通知 PropertyGrid 它应该处理更新对象。
[RefreshProperties(RefreshProperties.All)]
public byte[] data get; set; = new byte[5];
对要响应在 PropertyGrid 控件中进行编辑的类上的每个属性执行此操作。请注意,特别是对于这个属性,您必须分配一个 new 字节数组,而不仅仅是修改现有数组的值。
【讨论】:
这很好用!但是,它需要我单击PropertyGrid
中的属性才能刷新它们。有没有办法告诉 PropertyGrid 在修改 data
时刷新所有属性?我已将 RefreshProperties
属性放在类中的所有属性上
尝试RefreshProperties.Repaint
而不是.All
我尝试使用Repaint
,但行为仍然相同。不过,它肯定工作得很好。谢谢!
yourPropertyGrid.Refresh() 有什么问题?看我的回答。【参考方案2】:
据我所知,如果您以编程方式更改依赖属性,PropertyGrid 不会完全更新。在我的一个项目中,出于这个原因,我在程序更改后调用 PropertyGrid.Refresh()。但是我无法通过引用 MSDN 来证明这一点。
因此,如果您在数据设置器中知道 serialNumber 依赖于数据(PropertyGrid 现在肯定不依赖于数据),那么在 data.set 中调用 PropertyGrid.Refresh()(这需要您显式地写出设置器)。
不过,也许事件也有不同的方式。
编辑:另见此问题(和答案):PropertyGrid doesn't notice properties changed in code?
【讨论】:
以上是关于C#:更新时 PropertyGrid 不调用属性`Get`方法的主要内容,如果未能解决你的问题,请参考以下文章
C#中自定义propertygrid控件的属性,要求当点击不同的其他控件时,能在propertygrid控件中显示基本的信息