.NET PropertyGrid: различные права на чтение / запись для сложного объекта с использованием ExpandableObjectConverter - PullRequest
3 голосов
/ 07 ноября 2011

Я пытаюсь редактировать сложные объекты в элементе управления PropertyGrid. Я добавляю ExpandableObjectConverter (или мой собственный подкласс, когда мне это нужно) в качестве TypeConverter, и он отлично работает.

Единственное, что я не могу понять, это это. Сам объект будет иметь свое представление .ToString () рядом с ним в Grid. Затем, когда я раскрываю объект, атрибуты совпадают. Все можно редактировать. Я хочу отключить редактирование поля объекта ToString (), но оставить атрибуты доступными для редактирования.

Так что в PropertyGrid это будет выглядеть так:

+ Color      {(R,G,B,A) = (255,255,255,255)}  --uneditable
     Alpha   255                              --editable
     Blue    255                              --editable
     Green   255                              --editable
     Red     255                              --editable

Пока я не нашел способ сделать это. Если я попытаюсь сделать это ReadOnly, весь объект станет доступным только для чтения. Если я укажу свой собственный ExpandableObjectConverter и укажу, что он не может преобразовать строку, то если строка отредактирована в PropertyGrid, она все равно попытается привести к приведению, а затем потерпит неудачу.

По сути, я просто хочу, чтобы я мог запретить конечным пользователям редактировать строку и заставлять их редактировать отдельные атрибуты, чтобы мне не приходилось писать анализатор строк для каждого отдельного класса.

Возможно ли это, или есть другой способ сделать это, о котором я просто не думал?

1 Ответ

4 голосов
/ 07 ноября 2011

Это, кажется, делает трюк:

[TypeConverter(typeof (Color.ColorConverter))]
public struct Color
{
    private readonly byte alpha, red, green, blue;
    public Color(byte alpha, byte red, byte green, byte blue)
    {
        this.alpha = alpha;
        this.red = red;
        this.green = green;
        this.blue = blue;
    }
    public byte Alpha { get { return alpha; } }
    public byte Red { get { return red; } }
    public byte Green { get { return green; } }
    public byte Blue { get { return blue; } }
    public override string ToString()
    {
        return string.Format("{{(R,G,B,A) = ({0},{1},{2},{3})}}", Red, Green, Blue, Alpha);
    }
    private class ColorConverter : ExpandableObjectConverter
    {
        public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
        {
            return true;
        }
        public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
        {
            return new Color((byte)propertyValues["Alpha"], (byte)propertyValues["Red"],
                             (byte) propertyValues["Green"], (byte) propertyValues["Blue"]);
        }
    }
}
...