我有一个XMLDataProvider静态资源,因为我的数据列出了一些产品。我有两个控件作为Master Detail scenerio : 1) ListBox,它列出所有的产品标题;2) COntentControl,它显示产品的详细信息。
现在它工作得很好,但ContentControl使用的是硬编码模板。我想要的是显示具有不同模板的产品,并且ContentControl的ContentTemplate应该根据产品的字段( TemplateName )动态拾取。我如何才能做到这一点呢?我陷入了编写SelectTemplate覆盖方法的困境,在这个方法中,我不知道如何从参数(Object)访问TemplateName属性。
有没有什么代码会有帮助呢?
发布于 2010-06-23 11:20:55
您是说要查找名称由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>https://stackoverflow.com/questions/3092875
复制相似问题