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控件中显示基本的信息

C# PropertyGrid

C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)

C#自定义PropertyGrid属性

C#自定义PropertyGrid属性

C# PropertyGrid 简单使用