В Designer: свойство по умолчанию установлено значение, но свойство не вызывается при установке по умолчанию? - PullRequest
3 голосов
/ 20 марта 2011

У меня есть кусок кода, который выглядит примерно так:

[DefaultValue(false)]
public bool Property
{
    set
    {
        blah = value;
        someControl.Visible = value;
    }
    get
    {
        return blah;
    }
}

Когда я смотрю на свойства в конструкторе, для свойства устанавливается значение false (или true, если я играю с ним). Но свойство на самом деле не установлено. Значение Visible элемента управления не изменяется.

Как сделать так, чтобы дизайнер фактически установил для свойства значение по умолчанию?

Ответы [ 2 ]

3 голосов
/ 20 марта 2011

Атрибут [DefaultValue] является только подсказкой для дизайнера и сериализатора. Вы полностью должны убедиться, что значение по умолчанию, которое вы обещали в атрибуте, фактически является значением свойства. Установщик свойства не вызывается в вашем случае, потому что сериализатор обнаружил, что текущее значение свойства равно значению по умолчанию и, таким образом, может опустить присвоение свойства. Это оптимизация, она делает InitializeComponent () меньше и быстрее.

Вы гарантируете это, просто инициализируя значение свойства в своем конструкторе. Помните, что для свойства элемента управления Visible по умолчанию установлено значение true.

1 голос
/ 20 марта 2011

Два варианта;

  • убрать значение по умолчанию (по умолчанию bool равно false)
  • используйте ShouldSerialize *, чтобы прояснить ситуацию

в последнем, вы можете хотеть bool? отследить «явный набор» против «неявного по умолчанию»:

private bool? property;
public bool Property
{
    set
    {
        property = value;
        someControl.Visible = value;
    }
    get
    {
        return property.GetValueOrDefault();
    }
}
public void ResetProperty() { property = null; }
public bool ShouldSerializeProperty() { return property.HasValue; }

Обратите внимание, что Reset * и ShouldSerialize * - это шаблоны, распознаваемые компонентной моделью.

...