我想在我的PropertyGrid
. 该类如下所示:
public class Parameter
{
[Description("the name")]
public string Name { get; set; }
[Description("the value"), ReadOnly(true)]
public string Value { get; set; }
[Description("the description")]
public string Description { get; set; }
}
我有很多该类的实例TreeView
。当我在其中选择其中一个时TreeView
,属性会PropertyGrid
按预期显示。到目前为止一切顺利,但我想通过以下方式自定义此行为:
对于每个单独的实例,我希望能够防止用户修改特定属性。通过ReadOnly(true)
在我的班级中设置(如您在上面的示例中所见),所有Value
属性都将在class-level上禁用。
经过一番研究,我发现了以下解决方案,它使我有机会在运行时启用/禁用特定属性:
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(this)["Value"];
ReadOnlyAttribute attr =
(ReadOnlyAttribute)descriptor.Attributes[typeof(ReadOnlyAttribute)];
FieldInfo isReadOnly = attr.GetType().GetField(
"isReadOnly", BindingFlags.NonPublic | BindingFlags.Instance);
isReadOnly.SetValue(attr, false);
这种方法工作得很好,但不幸的是也仅限于类级别。这意味着如果我将Value
's设置isReadOnly
为false
,我的所有Parameter
-objects 都具有Value
可写属性。但我只希望在那个特定的对象上(因此是object-level)。我真的不想为读/写和只读属性创建单独的类。
由于我的想法不多了,非常感谢您的帮助:)
提前致谢!
编辑:我需要将只读属性显示为灰色,以便用户可以看到不允许或无法编辑它们。