我希望在我的
我有许多这个类的实例在一个TreeView中。当我在TreeView中选择其中一个实例时,其属性如预期一样显示在PropertyGrid中。到目前为止一切都好,但我想以以下方式自定义此行为:
对于每个单独的实例,我希望能够防止用户修改特定属性。通过在我的类中设置ReadOnly(true)(如上所示),所有Value属性将在类级别上禁用。
经过一些研究,我找到了以下解决方案,可以使我有机会在运行时启用/禁用特定属性:
这种方法在类级别上是完全可行的,但不幸的是只限于类级别。这意味着如果我将“Value”的“isReadOnly”设置为“false”,所有我的“Parameter”对象的“Value”属性都可写。但我只想在特定对象(因此是对象级别)上实现这一点。我真的不想为只读和可读属性创建不同的类。
由于我已经没有更多的想法,非常感谢你的帮助 :)
提前致谢!
编辑:我需要将只读属性灰色显示,以便用户可以看到它们不允许或不可能进行编辑。
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属性将在类级别上禁用。
经过一些研究,我找到了以下解决方案,可以使我有机会在运行时启用/禁用特定属性:
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”的“isReadOnly”设置为“false”,所有我的“Parameter”对象的“Value”属性都可写。但我只想在特定对象(因此是对象级别)上实现这一点。我真的不想为只读和可读属性创建不同的类。
由于我已经没有更多的想法,非常感谢你的帮助 :)
提前致谢!
编辑:我需要将只读属性灰色显示,以便用户可以看到它们不允许或不可能进行编辑。