ContentTemplateSelector и Выбрать шаблон на основе выбранного элемента ListBoxItem
У меня есть статический ресурс XMLDataProvider для моих данных, перечисляющий некоторые продукты. У меня есть два элемента управления как Master Detail scenerio 1) ListBox, в котором перечислены все названия продуктов, и 2) COntentControl, который отображает сведения о продукте.
Сейчас он работает нормально, но ContentControl использует жестко закодированный шаблон. Я хочу, чтобы отображались продукты с различными шаблонами, а ContentTemplate ContentControl должен подбираться динамически на основе поля Product (TemplateName). Как я могу это сделать? Я застрял в написании метода переопределения SelectTemplate, в котором я не знаю, как получить доступ к свойству TemplateName из параметра (объекта).
Любой код будет полезен?
1 ответ
Вы хотите сказать, что хотите найти ресурс DataTemplate, имя которого задается атрибутом XmlNode? Чтобы сделать это, вы могли бы бросить item
в XmlElement, чтобы найти требуемое значение, а затем вызовите TryFindResource для поиска ресурса:
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var fe = container as FrameworkElement;
var element = item as XmlElement;
if (fe != null && element != null)
{
var templateName = element.GetAttribute("TemplateName");
if (templateName != null)
{
return fe.TryFindResource(templateName) as DataTemplate;
}
}
return null;
}
Вы также можете сделать нечто подобное полностью в XAML, определив стиль для ContentControl, который использует DataTriggers для установки ContentTemplate:
<Style x:Key="DynamicTemplateStyle" TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding XPath=@TemplateName}" Value="FirstTemplate">
<Setter Property="ContentTemplate" Value="{StaticResource FirstTemplate}"/>
</DataTrigger>
<DataTrigger Binding="{Binding XPath=@TemplateName}" Value="SecondTemplate">
<Setter Property="ContentTemplate" Value="{StaticResource SecondTemplate}"/>
</DataTrigger>
<!-- etc. -->
</Style.Triggers>
</Style>