ContentTemplateSelector и Выбрать шаблон на основе выбранного элемента ListBoxItem - PullRequest
0 голосов
/ 22 июня 2010

У меня есть статический ресурс XMLDataProvider для моих данных, в котором перечислены некоторые продукты. У меня есть два элемента управления как Master Detail Scenerio 1) ListBox, в котором перечислены все названия продуктов и 2) COntentControl, который отображает сведения о продукте.

Сейчас он работает нормально, но ContentControl использует жестко закодированный шаблон. Я хочу, чтобы отображались продукты с различными шаблонами, а ContentTemplate ContentControl должен подбираться динамически на основе поля Product (TemplateName). Как я могу это сделать? Я застрял в написании метода переопределения SelectTemplate, в котором я не знаю, как получить доступ к свойству TemplateName из параметра (объекта).

Какой код будет полезен?

1 Ответ

2 голосов
/ 23 июня 2010

Вы хотите сказать, что хотите найти ресурс 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>
...