2010-06-22 55 views
0

我有一个XMLDataProvider静态资源,就像我的数据列出了一些产品一样。 我有两个控件作为主细节scenerio 1)列出所有产品标题的列表框和 2)显示产品细节的COntentControl。ContentTemplateSelector和基于ListBoxItem选择模板项目

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

任何代码将是有帮助的吗?

回答

2

你是说你想查找一个DataTemplate资源,其中的名称由XmlNode的属性给出?要做到这一点,你可以投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类似的东西使用DataTriggers设置ContentTemplate的ContentControl:

<Style x:Key="DynamicTemplateStyle" TargetType="ContentControl"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding [email protected]}" Value="FirstTemplate"> 
      <Setter Property="ContentTemplate" Value="{StaticResource FirstTemplate}"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding [email protected]}" Value="SecondTemplate"> 
      <Setter Property="ContentTemplate" Value="{StaticResource SecondTemplate}"/> 
     </DataTrigger> 
     <!-- etc. --> 
    </Style.Triggers> 
</Style>