Я провел несколько тестов, используя точно такую же декларативную разметку, как в вашем примере.Мой код ниже показан ниже.Комментарии справа показывают значения свойств .Visible
двух элементов после выполнения кода слева от каждого комментария.Я использовал локальные переменные parent
и child
, чтобы прояснить ситуацию.
1 var parent = dvDropShipMsgWrap; // parent child
2 var child = lblAttributeDropShipMsg; // false false (initial values)
3 child.Visible = true; // false false
4 parent.Visible = true; // true true
5 parent.Visible = false; // false false
6 child.Visible = false; // false false
7 parent.Visible = true; // true false
Я думаю, что результатом в строке 3, вероятно, является поведение, которое вы наблюдали.Но здесь происходит гораздо больше, чем может показаться на первый взгляд.
Если вы посмотрите на код CIL, который получает / устанавливает свойство .Visible
элемента управления, вы обнаружите, что установка значения элемента управления действительно влияет на значениевнутреннего битового флага, независимо от видимости родителя.Однако, получая значение свойства .Visible
элемента управления, код пересекает путь, начинающийся с данного элемента управления, вплоть до его родителя, затем до родительского элемента родителя и т. Д., Вплоть до корня иерархии элементов управления.Если внутренний битовый флаг какого-либо элемента управления на этом пути указывает «не видно», обход останавливается, и возвращается значение false
.Единственный способ вернуть true
- это пройти весь путь до корня, не найдя никакого невидимого элемента управления.
Итак, для подведения итогов, установка свойства .Visible
элемента управления «запоминается» внутри, но значение свойства будет возвращено как false
, если какой-либо из его предков не виден.Когда все предки элемента управления становятся видимыми, значение свойства .Visible
элемента управления будет «запомненным» значением с момента его последней установки.