我有一个XMLDataProvider静态资源,我的数据列出了一些产品。 我有两个控件作为主细节scenerio 1)列出所有产品标题和列表的ListBox 2)显示产品详细信息的COntentControl。
现在它的工作正常,但ContentControl正在使用硬编码的模板。 我想要的是显示具有不同模板的产品,ContentControl的ContentTemplate应该根据产品的字段(TemplateName)动态选取。我怎样才能做到这一点? 我一直在编写SelectTemplate覆盖方法,其中我不知道如何从参数(对象)访问TemplateName属性。
任何代码都会有帮助吗?
答案 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>