C#:PropertyGrid在更新时没有调用Property`get`方法

时间:2018-02-15 13:26:14

标签: c# .net

我已经坚持了这个问题,我似乎无法绕过这个问题。我有一个类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时会不会更新属性?

2 个答案:

答案 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 字节数组,而不仅仅是修改现有数组的值。