Свойство PropertyGrid только для чтения на уровне объекта -

Я хочу отобразить несколько экземпляров одного класса в своем 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);

Этот подход прекрасно работает, но, к сожалению, только на уровне класса -. Это означает, что если я установил для ValueisReadOnlyзначение false, все моих объектовParameter-имеют свойство Valueс возможностью записи.Но я хочу это ТОЛЬКО на этом конкретном объекте (таким образом объект -уровень). Я действительно не хочу создавать отдельные классы для свойств чтения/записи и только для чтения.

Поскольку у меня заканчиваются идеи, я очень ценю вашу помощь.:)

Заранее спасибо!

РЕДАКТИРОВАТЬ :Мне нужно, чтобы свойства, доступные только для чтения, -были выделены серым цветом, чтобы пользователь мог видеть, что их нельзя или нельзя редактировать.

8
задан reflective_mind 7 February 2017 в 10:42
поделиться