Как выполнить код в пользовательском элементе управления на основе открытых свойств только один раз? - PullRequest
0 голосов
/ 28 марта 2012

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

Конечно, публичное свойство не требуется устанавливать изначально, ноподпрограмма инициализации должна вызываться со значением по умолчанию.

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

В настоящее время он вызывается один раз в конструкторе, а затем снова, когда установщик свойств вызывается через код конструктора (если указан).Как с этим справиться?

Ответы [ 3 ]

0 голосов
/ 28 марта 2012

Вам нужно будет различать случаи, когда свойство меняет свое значение в «нормальной» операции, и когда конструктор изначально устанавливает его значение. Вы не указали платформу, но я считаю, что это невозможно сделать независимо.

Это приводит меня к выводу, что вам нужно изменить свой дизайн - вам нужно избегать вызова подпрограммы init в конструкторе.

0 голосов
/ 28 марта 2012

Если вы поместите DefaultValueAttribute перед вашим свойством, указав фактическое значение по умолчанию вашего свойства, конструктор форм Windows не будет генерировать код, который инициализирует свойство

[DefaultValue(0)]
private int _myProperty;
public int MyProperty { 
    get { return _value; }
    set
    {
        if (value !=  _myProperty) {
             _myProperty = value;
             HeavyInitialization();
        }
    }
}

Свойства инициализируются тольков InitializeComponent(); если значение, указанное в окне свойств, отличается от указанного значения по умолчанию.

Если вам вообще не нужно устанавливать это свойство в окне свойств, его можно скрыть из окна свойствс BrowsableAttribute.Вы можете полностью отключить сериализацию (генерацию кода для InitializeComponent) с помощью DesignerSerializationVisibilityAttribute.

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int MyProperty {
    ...
}
0 голосов
/ 28 марта 2012

Иметь логическое значение isInitialized = false, для которого в методе Init установлено значение true. Если вы выполняете код в нескольких потоках, возможно, вам придется с этим справиться, но, надеюсь, вы этого не сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...