首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据ListBoxItem ContentTemplateSelector项选择模板并选择模板

根据ListBoxItem ContentTemplateSelector项选择模板并选择模板
EN

Stack Overflow用户
提问于 2010-06-22 20:06:20
回答 1查看 2.2K关注 0票数 0

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

现在它工作得很好,但ContentControl使用的是硬编码模板。我想要的是显示具有不同模板的产品,并且ContentControl的ContentTemplate应该根据产品的字段( TemplateName )动态拾取。我如何才能做到这一点呢?我陷入了编写SelectTemplate覆盖方法的困境,在这个方法中,我不知道如何从参数(Object)访问TemplateName属性。

有没有什么代码会有帮助呢?

EN

回答 1

Stack Overflow用户

发布于 2010-06-23 11:20:55

您是说要查找名称由XmlNode的属性给定的DataTemplate资源吗?为此,您可以将item转换为XmlElement以找到所需的值,然后调用TryFindResource来执行资源查找:

代码语言:javascript
复制
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中执行完全类似的操作:

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3092875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档