我已经坚持了这个问题,我似乎无法绕过这个问题。我有一个类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);
}
.
.
.
}
}
其余属性相似。当我更新data
中的PropertyGrid
之后的任何属性时,会立即显示对data
的更改。例如,如果我通过在PropertyGrid
中手动键入值来更改序列号,则data
将相应更新。但是,相反的情况并非如此。如果我在data
修改PropertyGrid
以更改serialNumber
的值,则data
会更新,但serialNumber
则不会。
通过阅读文档,我对PropertyGrid
的理解可能有误,但是当更改某个属性时,不应该调用所有属性的Get
方法吗?当任何属性修改data
时,这似乎发生了什么。
为什么在修改data
时会不会更新属性?
答案 0 :(得分:0)
据我所知,如果以编程方式更改依赖属性,PropertyGrid不会完全更新。在我的一个项目中,由于这个原因,我在编程更改后调用了PropertyGrid.Refresh()。但是我不能通过引用MSDN证明这一点。
因此,如果您在数据的setter中知道serialNumber依赖于数据(PropertyGrid现在当然没有),那么在data.set中调用PropertyGrid.Refresh()(这要求您明确地写出setter)。
但也许事件也有不同的方式。
修改:另请参阅此问题(和答案):PropertyGrid doesn't notice properties changed in code?
答案 1 :(得分:0)
您应该使用RefreshPropertiesAttribute
修饰属性,以通知PropertyGrid它应该处理更新对象。
[RefreshProperties(RefreshProperties.All)]
public byte[] data { get; set; } = new byte[5];
对要在PropertyGrid控件中对编辑做出响应的类上的每个属性执行此操作。请注意,特别是对于此属性,您必须分配 new 字节数组,而不仅仅是修改现有数组的值。