ContentTemplateSelector并根据ListBoxItem Selected Item选择模板

时间:2010-06-22 12:06:20

标签: wpf contenttemplateselector

我有一个XMLDataProvider静态资源,我的数据列出了一些产品。 我有两个控件作为主细节scenerio 1)列出所有产品标题和列表的ListBox 2)显示产品详细信息的COntentControl。

现在它的工作正常,但ContentControl正在使用硬编码的模板。 我想要的是显示具有不同模板的产品,ContentControl的ContentTemplate应该根据产品的字段(TemplateName)动态选取。我怎样才能做到这一点?  我一直在编写SelectTemplate覆盖方法,其中我不知道如何从参数(对象)访问TemplateName属性。

任何代码都会有帮助吗?

1 个答案:

答案 0 :(得分:2)

您是否想要查找名称由XmlNode属性指定的DataTemplate资源?为此,您可以将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;
}

您还可以通过为使用DataTriggers设置ContentTemplate的ContentControl定义样式,在XAML中完全执行类似操作:

<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>