C # остановить изменение свойства во время выполнения - PullRequest
2 голосов
/ 01 июня 2009

Я пытался создать пользовательский элемент управления с некоторыми пользовательскими свойствами, установленными в конструкторе. Однако элемент управления включает в себя некоторый код взаимодействия и настройки, которые не должны корректироваться во время выполнения. Есть ли способ остановить изменение значений после того, как они были изначально установлены кодом конструктора?

Ответы [ 4 ]

6 голосов
/ 01 июня 2009

Можете ли вы изменить определение свойства? Один из подходов состоит в том, чтобы добавить страж в установщик свойств и разрешить только одну операцию установки (которая обычно выполняется InitializeComponent ()):

private int _myProperty;
private bool _isMyPropertySet = false;
public int MyProperty
{
    set
    {
        if (!_isMyPropertySet)
        {
            _isMyPropertySet = true;
            _myProperty = value;
        }
        else
        {
            throw new NotSupportedException();
        }
    }
}
2 голосов
/ 01 июня 2009

Майкл предоставил отличный ответ, и он решит вашу проблему во время выполнения. Однако во время разработки, если вам нужно иметь возможность изменять это значение более одного раза (это время проектирования и вероятность, вероятно, высока), тогда вы захотите объединить проверку DesignMode с примером Майклса:

private int _myProperty;
private bool _isMyPropertySet = false;
public int MyProperty
{
    set
    {
        if (this.DesignMode || !_isMyPropertySet)
        {
                _isMyPropertySet = true;
                _myProperty = value;
        }
        else
        {
                throw new NotSupportedException();
        }
    }
}

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

1 голос
/ 01 июня 2009

Архитектура WinForms предоставляет встроенный способ проверить, выполняется ли код в настоящее время в режиме разработки, - свойство Component.DesignMode .

Таким образом, вы, вероятно, хотите реализовать что-то вроде этого:

private int _foo;

public int Foo
{
    get { return _foo; }
    set
    {
        if (this.DesignMode)
            throw new InvalidOperationException();

        _foo = value;
    }
}
1 голос
/ 01 июня 2009

Вы можете выдать исключение в установщике свойств?

public int SomeProperty {

   set {

      if(designerComplete) {
          throw new IllegalOperationException();
      }

   }

}

Установите designerComplete как переменную класса - установите его в true после вызова метода InitializeComponent в конструкторе.

...