.NET PropertyGrid: изменение прав чтения / записи для сложного объекта с использованием расширяемого objectconverter

#c# #.net #winforms #propertygrid

#c# #.net #winforms #сетка свойств

Вопрос:

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

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

Итак, в PropertyGrid это будет выглядеть следующим образом;

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

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

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

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

Комментарии:

1. Color — это мой собственный класс, называемый ‘Color4’, а не . ЧИСТЫЙ, извините.

2. это class или struct ? (Я думаю о разных вариантах)

3. k; У меня было кое-что, что работало для class; я попытаюсь заставить это работать для struct…

4. 2 причины: во-первых , большинство структур должны быть неизменяемыми (то есть без установщиков), что требует CreateInstance шаблона; во-вторых , в противном случае при использовании структуры сетка редактирует отключенную копию значения в штучной упаковке, что означает, что вы можете вносить изменения, которые никогда не применяются к фактическому экземпляру (вы можете увидеть это, добавив установщики в структуру и удалив материал для создания экземпляра)

5. практически то же самое, но без элементов CreateInstance. Также важно, чтобы CanConvertFrom отчеты false были строковыми (чтобы это не делало текстовую версию доступной для редактирования), но IIRC, который используется по умолчанию. В частности, когда это был класс , я позволял членам быть изменяемыми

Ответ №1:

Кажется, это делает свое дело:

 [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"]);
        }
    }
}