Ваш checkBox1
частный в базовом классе?Если это не так, то так и должно быть, потому что дизайнер сериализует оба установщика (один для checkBox1.Visible, а другой для ControlVisible), и только порядок сериализации будет определять конечное состояние, что плохо.
Также посмотрите на автоматически сгенерированный метод InitializeControls в файле Form1.designer.cs, явно ли он устанавливает для пользовательских свойств значения по умолчанию?
Наконец, попробуйте использовать ShouldSerialze и Reset и посмотри, у тебя другое поведение.
Редактировать
Я заново создал проблему и подключил один экземпляр VS для отладки другого.В первый раз, когда свойство ControlVisible
было оценено VS, оно вернуло false
, потому что checkBox1.Visible
(источник получения) был false
.Когда фактический элемент управления флажок был создан и показан, а окно свойств было прокручено для отображения ControlVisible
, его значение было снова оценено и возвращено true , которое является значением по умолчанию, однако кажется, что VS внутренне уже помеченэто свойство изменено, так как его начальное значение отличается от значения по умолчанию.Это может быть ошибка в VS.
Я создал простую демонстрацию эффекта:
public BaseForm()
{
InitializeComponent();
_testValue = false;
}
private bool _testValue;
[DefaultValue(true)]
public bool TestProperty
{
get { return _testValue; }
set { _testValue = value; }
}
protected override void OnVisibleChanged(EventArgs e)
{
_testValue = true;
base.OnVisibleChanged(e);
}
}
При наследовании вышеуказанного BaseForm
TestPropery
ведет себя точно так же, как ControlVisible
в вашем примере, поэтому ядумаю, что это ошибка в VS.
Решение вашей проблемы - использовать простое вспомогательное поле bool в качестве помощника, поскольку checkBox1.Visible ненадежен:
public BaseForm()
{
InitializeComponent();
checkBox1.Visible = _controlVisible = true;
}
private bool _controlVisible;
[DefaultValue(true)]
public bool ControlVisible
{
get { return _controlVisible; }
set { _controlVisible = checkBox1.Visible = value; }
}