Я предполагаю, что вы поместите какой-то объект, представляющий эти пары имя / значение, в ItemsControl
, установив его свойство ItemsSource
.
Есть несколько решений, которые вы можете использовать.
Использование DataTemplate
с триггерами:
Этот подход включает в себя выставление "типа" каждого из ваших объектов через свойство YourPropertyType
в виде строки. Вы установите ItemTemplate
вашего ItemsControl
на шаблон, в котором находится ContentControl
. У самого ContentControl
будет ContentTemplate
, выбранный динамически с помощью триггеров.
Все это можно сделать декларативно в XAML.
Я предполагаю, что у вас есть еще DataTemplates
с именем DefaultTemplate
(это может быть пустым), IntegerTemplate
, StringTemplate
и т. Д., Чтобы набросать визуальное дерево для каждого случая.
Тогда это будет ItemsControl.ItemTemplate
:
<DataTemplate>
<ContentControl
x:Name="MyContentControl"
Content="{Binding}"
ContentTemplate="{StaticResource DefaultTemplate}"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding YourPropertyType}" Value="Integer">
<Setter TargetName="MyContentControl" Property="ContentTemplate"
Value="{StaticResource IntegerTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding YourPropertyType}" Value="String">
<Setter TargetName="MyContentControl" Property="ContentTemplate"
Value="{StaticResource StringTemplate}" />
</DataTrigger>
<!-- and so on -->
</DataTemplate.Triggers>
</DataTemplate>
Использование DataTemplateSelector
:
Этот подход требует выделенного кода, но он не заставляет вас раскрывать «тип» каждой пары имя / значение в виде строки и позволяет выбирать, какой шаблон использовать с гораздо более сложной логикой.
Включает создание класса для выбора шаблона:
class YourObjectDataTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var yourObject = (YourObjectType) item;
// Get hold of a DataTemplate based on any attribute of item
var templateToUse = this.DefaultTemplate;
return templateToUse;
}
}
Затем вам нужно где-то создать экземпляр шаблона (скажем, внутри вашего UserControl
)
<UserControl.Resources>
<localNamespace:YourObjectDataTemplateSelector
x:Key="TemplateSelector"
DefaultTemplate="{StaticResource DefaultTemplate}"
/>
</UserControl.Resources>
Обратите внимание, что я выставил свойство DefaultTemplate
из YourObjectDataTemplateSelector
и установил для него шаблон из XAML. На практике вы определяете больше свойств типа DataTemplate
для YourObjectDataTemplateSelector
и «настраиваете» селектор шаблона при добавлении его в словарь ресурсов вашего элемента управления. Это позволяет вам напрямую устанавливать шаблоны для каждого случая, используя расширение разметки StaticResource
из XAML.
Наконец, подключите селектор шаблонов к вашему ItemsControl
:
<ItemsControl
ItemsSource="..."
ItemTemplateSelector={StaticResource TemplateSelector}"
/>