Вкратце, я работаю над приложением, которое использует ASP.Net Web Forms.
Имеет страницу aspx, которая включает выражение привязки данных для привязки одного из общедоступных свойств страницы к свойству пользовательского элемента управления. Реальная страница довольно сложная, но я смог продублировать поведение на очень простом примере.
Page.aspx:
<uc:CustomControl runat="server" Text='<%# Text %>' />
В переопределении OnInit страницы он вызывает метод DataBind страницы.
Page.aspx.cs:
protected override void OnInit(EventArgs e)
{
DataBind();
base.OnInit(e);
}
Проблема заключается в том, что свойство Text пользовательского дочернего элемента управления остается нулевым, пока этот элемент управления не вызовет base.DataBind ().
UserControl.ascx.cs:
public string Text { get; set; }
public override void DataBind()
{
// Text is null at this point
base.Databind();
// Text is populated at this point
}
Но выражение привязки данных, которое связывает это текстовое свойство со свойством Text дочернего элемента управления, находится в родительской разметке . С какой стати метод DataBind дочернего элемента управления должен быть вызван до присвоения значения?
Это ужасно неудобно, потому что оно не позволяет передавать данные со страницы на произвольную глубину во время привязки данных. Чтобы получить доступ к значению привязки данных из разметки родителя, дочерний элемент управления страницы должен вызвать base.DataBind, но это приводит к тому, что его дочерние элементы управления получают привязку к данным, даже если у него не было времени заполнить данные этих потомков.
Как данные должны передаваться от родителя к потомку во время привязки данных, если данные связаны в обратном порядке? Чего мне не хватает?