Как установить DefaultValueAttribute для свойства коллекции List‹Color› (установить цвета по умолчанию)?

поэтому я объявил свойство коллекции List для своего пользовательского элемента управления, когда я пытаюсь установить DefaultValueAttribute, он не компилируется с ошибкой:

Аргумент атрибута должен быть константным выражением, выражением typeof или выражением создания массива типа параметра атрибута

.. что я/м делаю не так?

    private List<Color> _gradientColorList = new List<Color>();
    [CategoryAttribute("Appearance")]
    [DefaultValueAttribute(new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }))]
    public List<Color> GradientColorList
    {
        get
        {
            return _gradientColorList;
        }
        set
        {
            try
            {
                if (value == null)
                    throw new ArgumentNullException();
                if (value == null || value.Count < 2)
                    throw new Exception("Gradient color list count is less than 2.");
                _gradientColorList = value;
                CreateGradientList(GradientColorList);
                Invalidate();
            }
            catch (Exception exc)
            {
                ExcMessageBox(exc);
            }
        }
    }

и еще один вопрос: когда я добавляю или удаляю цвета из моего свойства коллекции GradientColorList в редакторе свойств Visual Studio (редактор коллекции цветов), блок set, содержащий try-catch, не работает, и я не знаю Зачем? как это исправить?


person vendersecured    schedule 02.12.2013    source источник
comment
Худшее, что вы можете сделать, это поймать исключение в установщике свойств, чтобы показать окно сообщения.   -  person Dennis    schedule 02.12.2013


Ответы (2)


Вместо использования DefaultValueAttribute вы можете назначить градиентColorList как

private List<Color> _gradientColorList = new List<Color>(new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }));

Во второй части всякий раз, когда вы добавляете или удаляете объект в списке, сеттер не вызывается. Он будет вызываться только тогда, когда вы присвоите значение «GradientColorList». Если вы привязываете это к пользовательскому интерфейсу, лучше используйте ObserverableCollection, который внутренне запускает событие изменения коллекции при добавлении или удалении объекта.

person vijay053    schedule 02.12.2013

Как говорит вам компилятор: вы не можете использовать параметр List<> as для атрибута. Все параметры, которые вы предоставляете атрибутам, должны быть постоянными. Это означает, что они не должны изменяться. В то время как массив соответствует этому критерию, динамический список, в который вы можете добавлять/удалять элементы на лету, — нет. Попробуйте создать константу со списком, это не сработает:

const List<Color> COLORS = new List<Color>();

Если вы хотите указать значение по умолчанию, у вас, на мой взгляд, есть три варианта:

  • Установите _gradientColorList на значение по умолчанию:

    private _gradientColorList = new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }));
    
  • Измените свою функцию get на следующее:

    if (_gradientColorList == null)
    {
        return new List<Color>(new Color[] { Color.FromArgb(116, 194, 225), Color.FromArgb(1, 145, 200), Color.FromArgb(0, 91, 154) }));
    }    
    return _gradientColorList;
    
  • Используйте массив вместо списка

person RononDex    schedule 02.12.2013