0

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

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

任何代码都会有帮助吗?

4

1 回答 1

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>
于 2010-06-23T03:20:54.760 回答