2010-06-22 4 views
0

J'ai une ressource statique XMLDataProvider pour mes données listant certains produits. J'ai deux contrôles comme maître Détail scenerio 1) ListBox qui répertorie tous les titres de produit et 2) COntentControl qui affiche les détails du produit. Maintenant, ça fonctionne bien pour le moment, mais le ContentControl utilise un Template codé en dur. Ce que je veux, c'est afficher des produits avec différents modèles et ContentTemplate ContentControl devrait être ramassé dynamiquement en fonction du champ du produit (TemplateName). Comment puis je faire ça? Je suis bloqué dans l'écriture de la méthode de substitution SelectTemplate dans laquelle je ne sais pas comment accéder à la propriété TemplateName à partir du paramètre (objet).ContentTemplateSelector et choisir un modèle basé sur l'élément sélectionné ListBoxItem

Un code serait utile?

Répondre

2

Voulez-vous dire que vous voulez rechercher une ressource DataTemplate dont le nom est donné par un attribut d'un XmlNode? Pour ce faire, vous pourriez lancer item à un XmlElement pour trouver la valeur que vous voulez, puis appelez TryFindResource pour faire la recherche de ressources:

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; 
} 

Vous pouvez aussi faire quelque chose de similaire entièrement en XAML en définissant un style pour la ContentControl qui utilise DataTriggers pour définir ContentTemplate:

<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> 
Questions connexes