Почему элемент управления с Visible = false, установленный в начале своей жизни, игнорирует изменения в связанных свойствах? - PullRequest
0 голосов
/ 22 апреля 2020

Я недавно натолкнулся на то, что кажется странным для привязки свойства win form в том, что если элемент управления начинает жизнь * как невидимый, то элемент управления, похоже, не видит изменений в связанном свойстве. В этом случае я связывал свойство .Visible метки с Properties.Settings.Default.BooleanSetting (по умолчанию False) в настройках приложения. Я также привязывал флажок .Checked к той же настройке, идея заключалась в том, что переключение флажка на флажок приведет к тому, что метка появится, а если ее не отметить, она исчезнет. Все настройки выполнялись в конструкторе форм

. Это работало надежно только в том случае, если для параметра установлено значение True при запуске приложения. Если параметр имеет значение False, флажок будет снят, а метка невидима, но флажок не будет отображать метку. После отладки выяснилось, что значение параметра было истинным, поэтому флажок обновил его, но свойство Visible метки по-прежнему было ложным

Другие связанные свойства, похоже, не имели проблем если метка была изначально видна ; Enabled может быть привязан и будет надежно переворачивать состояние при переключении флажка независимо от начального значения параметра. Проблема, по-видимому, заключалась в том, что метка изначально была невидимой - невидимая метка со свойством Enabled, привязанным к этому логическому , не изменила бы состояния Enabled.

Обходное решение, похоже, заключается в том, чтобы сохранить Properties.Settings.Default.BooleanSetting, установить его в true перед вызовом InitializeComponent(), а затем восстановить его. В этом случае форма будет отображаться, и флажок покажет невидимую метку

            var b = Properties.Settings.Default.FormatWithoutConfirmation;
            Properties.Settings.Default.FormatWithoutConfirmation = true;
            InitializeComponent();
            Properties.Settings.Default.FormatWithoutConfirmation = b;

Сначала я сделал вывод (с некоторой помощью из соответствующего вопроса здесь - спрашивая о том, как заставить его работать), что элемент управления должен быть изначально видимым для привязки к работе, а наличие элемента управления невидимым помещает элемент управления в ловушку 22, чтобы никогда не быть видимым, чтобы увидеть изменение в Visible ..

Похоже, что это однократная настройка, а не «если элемент управления становится невидимым, он перестает слушать», потому что если он всегда воздействует на невидимый элемент управления, то элемент управления, который начался видимым, будет go невидимым и никогда return - это не так, и изначально видимые элементы управления прекрасно включают и выключают видимость.

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

        this.label4.AutoSize = true;
        this.label4.DataBindings.Add(new System.Windows.Forms.Binding("Enabled", global::Namespace.Properties.Settings.Default, "BooleanSetting", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
        this.label4.Enabled = global::Namespace.Properties.Settings.Default.BooleanSetting;
        this.label4.Location = new System.Drawing.Point(100, 100);
        this.label4.Name = "label4";
        this.label4.Size = new System.Drawing.Size(35, 13);
        this.label4.TabIndex = 11;
        this.label4.Text = "label4";
        this.label4.Visible = false;

В то время, когда здесь установлена ​​привязка, видимость должна быть True , так как это значение по умолчанию для свойства Visible. Похоже, что что-то еще случается позже с окончанием sh после установки или что в начале жизни элемента управления (но не так рано) наступает критический момент, когда с ним происходит что-то, определяющее, победит он или нет ». Прислушиваться к связанным изменениям свойств


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

предполагается, что привязка к свойству Visible элемента управления нарушена, несмотря на то, что иногда он работает. См. http://support.microsoft.com/kb/327305, в котором столько же

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


*, не уверен, когда начинается жизнь элемента управления, см. «Видимость устанавливается после привязки». создано "примечание

...