Казалось бы, вы заинтересованы в привязке значений словаря к аккордеону. Чтобы воспользоваться преимуществами привязки данных, вы должны использовать шаблоны элемента управления вместо явного определения областей аккордеона. Например:
<cc1:Accordion ID="Accordion1" runat="server"
FadeTransitions="True"
SelectedIndex="0"
HeaderCssClass="accordionHeader"
ContentCssClass="accordionContent"
Width="370px">
<HeaderTemplate>
<h2><asp:Label runat="server" Text='<%# Eval("Key") %>' /></h2>
</HeaderTemplate>
<ContentTemplate>
<div><asp:Label runat="server" Text='<%# Eval("Value") %>' /></div>
</ContentTemplate>
</cc1:Accordion>
Теперь, если значения вашего словаря являются сложными объектами, что может быть правдой, так как вы описываете наличие нескольких элементов управления в вашем контенте, вы все равно можете связываться со словарем. Рассмотрим чуть более сложный словарь ниже. Для простоты демонстрации значения словаря представляют собой простые совпадающие анонимные типы:
protected void Page_Load(object sender, EventArgs e)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("key1", new { Color = "Red", Age = 15 });
dic.Add("key2", new { Color = "Green", Age = 25 });
Accordion1.DataSource = dic;
Accordion1.DataBind();
}
Вы можете "преследовать" свойства в выражениях привязки данных с помощью аккордеона, настроенного так:
<cc1:Accordion ID="Accordion1" runat="server"
FadeTransitions="True"
SelectedIndex="0"
HeaderCssClass="accordionHeader"
ContentCssClass="accordionContent"
Width="370px">
<HeaderTemplate>
<h2><asp:Label runat="server" Text='<%# Eval("Key") %>' /></h2>
</HeaderTemplate>
<ContentTemplate>
<div><asp:Label runat="server" Text='<%# Eval("Value.Color") %>' /></div>
<div><asp:Label runat="server" Text='<%# Eval("Value.Age") %>' /></div>
</ContentTemplate>
</cc1:Accordion>
Обратите внимание, что единственным важным отличием является точечная нотация в операторах Eval
.
Если, с другой стороны, значение словаря представляет собой (или содержит) коллекцию объектов, не так уж и просто встроить более сложные элементы управления ASP.NET в шаблон содержимого. Рассмотрим следующий словарь:
var dic = new Dictionary<string, IEnumerable<object>>();
dic.Add("key1", new List<object>()
{
new { Color = "Red" },
new { Color = "Blue" }
});
dic.Add("key2", new List<object>()
{
new { Color = "Yellow" },
new { Color = "Orange" }
});
Предположим, цель состоит в том, чтобы представить каждый из цветов в одной и той же области содержимого. Это может быть достигнуто путем привязки значения словаря к повторителю, например так:
<cc1:Accordion ID="Accordion1" runat="server"
FadeTransitions="True"
SelectedIndex="0"
HeaderCssClass="accordionHeader"
ContentCssClass="accordionContent"
Width="370px">
<HeaderTemplate>
<h2><asp:Label ID="Label1" runat="server" Text='<%# Eval("Key") %>' /></h2>
</HeaderTemplate>
<ContentTemplate>
<asp:Repeater ID="repeater" runat="server" DataSource='<%# Eval("Value") %>'>
<ItemTemplate>
<div><asp:Label runat="server" Text='<%# Eval("Color") %>' /></div>
</ItemTemplate>
</asp:Repeater>
</ContentTemplate>
</cc1:Accordion>
Удачного кодирования!