【问题标题】:ContentTemplateSelector and Choose Template based upon the ListBoxItem Selected ItemContentTemplateSelector 并根据 ListBoxItem 选定项选择模板
【发布时间】:2010-06-22 12:06:20
【问题描述】:

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

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

任何代码都会有帮助吗?

【问题讨论】:

    标签: wpf contenttemplateselector


    【解决方案1】:

    您是说要查找名称由 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;
    }
    

    你也可以在 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-20
      • 1970-01-01
      相关资源
      最近更新 更多