Я хочу отобразить несколько экземпляров одного класса в своем 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
с возможностью записи.Но я хочу это ТОЛЬКО на этом конкретном объекте (таким образом объект -уровень). Я действительно не хочу создавать отдельные классы для свойств чтения/записи и только для чтения.
Поскольку у меня заканчиваются идеи, я очень ценю вашу помощь.:)
Заранее спасибо!
РЕДАКТИРОВАТЬ :Мне нужно, чтобы свойства, доступные только для чтения, -были выделены серым цветом, чтобы пользователь мог видеть, что их нельзя или нельзя редактировать.