2010-03-28 7 views
1

J'ai mon petit outil de conception (mon programme).Liaison WPF/Silverlight lors de la définition par programme de DataTemplate

Sur le côté gauche j'ai TreeView et sur le bon site j'ai accordéon. Lorsque je sélectionne un nœud, je veux créer dynamiquement des éléments d'accordéon basés sur les propriétés de DataContext du nœud sélectionné.

La sélection de nœuds fonctionne correctement, et lorsque j'utilise cet exemple de code pour le tester, cela fonctionne également.

code XAML:

<layoutToolkit:Accordion x:Name="accPanel" 
         SelectionMode="ZeroOrMore" 
         SelectionSequence="Simultaneous"> 
    <layoutToolkit:AccordionItem Header="Controller Info"> 
    <StackPanel Orientation="Horizontal" DataContext="{Binding}"> 
     <TextBlock Text="Content:" /> 
     <TextBlock Text="{Binding Path=Name}" /> 
    </StackPanel> 
    </layoutToolkit:AccordionItem> 
</layoutToolkit:Accordion> 

code C#:

private void treeSceneNode_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    if (e.NewValue != e.OldValue) 
    { 
     if (e.NewValue is SceneNode) 
     { 
     accPanel.DataContext = e.NewValue; //e.NewValue is a class that contains Name property 
     } 
    } 
} 

Mais le problème se produit quand je suis en train de achive cela en utilisant DateTemplate et construire dynamiquement AccordingItem, la liaison ne fonctionne pas:

<layoutToolkit:Accordion x:Name="accPanel" 
         SelectionMode="ZeroOrMore" 
         SelectionSequence="Simultaneous" /> 

et DataTemplate dans mon ResourceDictionary

<DataTemplate x:Key="dtSceneNodeContent"> 
    <StackPanel Orientation="Horizontal" DataContext="{Binding}"> 
     <TextBlock Text="Content:" /> 
     <TextBlock Text="{Binding Path=Name}" /> 
    </StackPanel> 
</DataTemplate> 

et code C#:

private void treeSceneNode_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    if (e.NewValue != e.OldValue) 
    { 
    ResourceDictionary rd = new ResourceDictionary(); 
    rd.Source = new Uri("/SilverGL.GUI;component/SilverGLDesignerResourceDictionary.xaml", UriKind.RelativeOrAbsolute); 

    if (e.NewValue is SceneNode) 
    { 
     accPanel.DataContext = e.NewValue; 

     AccordionItem accController = new AccordionItem(); 
     accController.Header = "Controller Info"; 
     accController.ContentTemplate = rd["dtSceneNodeContent"] as DataTemplate; 

     accPanel.Items.Add(accController); 
    } 
    else 
    { 
     // Other type of node 
    } 
    } 
} 
+0

Pourriez-vous développer sur "ne fonctionne pas" - exception, résultat incorrect, rien ne se passe? Voyez-vous des erreurs de liaison dans la fenêtre Sortie? – itowlson

+0

Bonjour itowlson, Je n'ai aucune exception ou erreur dans la sortie. Simplement, le premier exemple "static" "static" me montre "Content: Scene Root Node", où "Scene Root Node" vient de Name Property. Deuxième "mauvais", "dynamique" exemple me montre seulement "Contenu:". Et je ne peux pas comprendre où est le problème. Oui, j'ai vérifié la fenêtre de sortie et rien n'est là. –

Répondre

0

Il vous manque cela?

accController.Content = e.NewValue; 

Aussi, je ne pense pas que vous devez utiliser DataContext = "{} Reliure"; le DataContext héritera quand même.

+0

Vous avez raison dans les deux cas. Je pensais que le réglage accPanel.DataContext = e.NewValue; propagerait les données vers les éléments, mais j'avais tort, en effet. Merci. –