Я настраиваю пользовательский элемент управления, управляемый конфигурацией XML. Это проще объяснить на примере. Взгляните на следующий фрагмент конфигурации:
<node>
<text lbl="Text:"/>
<checkbox lbl="Check me:" checked="true"/>
</node>
Чего я пытаюсь добиться, чтобы перевести этот фрагмент в одно текстовое поле и элемент управления флажком. Конечно, если бы фрагмент содержал больше узлов, больше элементов управления было бы сгенерировано автоматически.
Дайте итерационный характер задачи, которую я выбрал для использования Repeater. Внутри него я поместил два (более подробно, см. Ниже) Controls, один CheckBox и один Editbox. Чтобы выбрать, какой элемент управления активировать, я использовал команду встроенного переключателя, проверяя имя текущего узла конфигурации.
К сожалению, это не работает. Проблема заключается в том, что коммутатор работает во время рендеринга, задолго до того, как произошло связывание данных. Это само по себе не будет проблемой, не потому, что узел конфигурации может предложить необходимую информацию для привязки данных. Подумайте, что произойдет, если элемент управления флажком попытается привязаться к текстовому узлу в приведенном выше фрагменте кода, отчаянно ища его проверенный атрибут.
Есть идеи, как сделать это возможным?
Спасибо,
Боаз
Вот мой текущий код:
Вот мой код (который работает по более сложному синтаксису, чем приведенный выше):
<asp:Repeater ID="settingRepeater" runat="server">
<ItemTemplate>
<%
switch (((XmlNode)Page.GetDataItem()).LocalName)
{
case "text":
%>
<asp:Label ID="settingsLabel" CssClass="editlabel" Text='<%# XPath("@lbl") %>' runat="server" />
<asp:TextBox ID="settingsLabelText" Text='<%# SettingsNode.SelectSingleNode(XPath("@xpath").ToString()).InnerText %>'
runat="server" AutoPostBack="true" Columns='<%# XmlUtils.OptReadInt((XmlNode)Page.GetDataItem(),"@width",20) %>'
/>
<% break;
case "checkbox":
%>
<asp:CheckBox ID="settingsCheckBox" Text='<%# XPath("@lbl") %>' runat="server"
Checked='<%# ((XmlElement)SettingsNode.SelectSingleNode(XPath("@xpath").ToString())).HasAttribute(XPath("@att").ToString()) %>'
/>
<% break;
} %>
</ItemTemplate>
</asp:Repeater>