Конечно, загадочное поведение, как это иногда бывает в WebForms со многими фазами выполнения.
Несмотря на то, что это просто простой доступ для чтения к свойству Controls, это свойство может действительно выполнить большую работу для возвратаребенок контролирует.В частности, он не может вернуть дочерние элементы управления, если они не были созданы, и это создание обычно не происходит до более позднего этапа жизненного цикла страницы.Таким образом, получая доступ к нему в InitComplete, дети в конечном итоге создаются преждевременно, до того, как произойдут некоторые важные подключения к динамическим данным, в результате чего некоторые элементы управления будут отсутствовать.Да, я понимаю, что поведение конечного результата, кажется, не имеет большого смысла, поэтому некоторые люди предпочитают прямолинейность MVC:)
В качестве альтернативного возможного обходного пути, не могли бы вы попробовать перенести инъекцию из InitComplete в PreLoad?например,
page.PreLoad += (src, args) => InjectUserControls(page);
Я почти уверен, что это решит проблему, хотя я менее уверен, вызовет ли это проблемы с вашей KernelContainer.Inject
логикой.Попробуйте, так как это проще, чем ваш обходной путь.
Если это не сработает, я думаю, что ваш обходной путь в порядке, так как он задерживает перечисление до тех пор, пока не будут созданы дочерние элементы.Что касается '. Достаточно ли еще рано вводить элементы управления после события привязки данных ', я думаю, что это зависит от того, что именно делает KernelContainer.Inject
, и от того, какие ожидания он ожидает от состояния элемента управления.