2010-12-13 55 views
4

Je veux lier mon MultiDataTrigger.Conditions au bouton radio, mais cela ne fonctionne pas. voici mon scénario.Impossible de trouver la source pour la liaison avec la référence

En wpf, j'ai un GridPanel, qui suppose d'y avoir des radiobuttons.

je générer radiobuttons dynamiques dans GridPanel, comme ceci:

RadioButton allAccountBtn = new RadioButton(); 
allAccountBtn.Name = "allAccountBtn"; 
GridPanel.Children.Add(allAccountBtn); 

puis dans mon XAML, j'avais un bouton d'image qui va changer en fonction de cette sélection radiobutton, et la propriété d'un autre contrôle.

voici mon code:

<Button> 
<Button.Template> 
     <ControlTemplate> 
       <Image Name="addFolderIcon" Source="Icon/Decoration/folderColor.png"> 
       <ControlTemplate.Triggers> 
         <MultiDataTrigger> 
          <MultiDataTrigger.Conditions> 
            <Condition Binding="{Binding Tag, ElementName=folderBackBtn}" Value="{x:Null}"/> 
            <Condition Binding="{Binding IsChecked, ElementName=allAccountsBtn}" Value="True"/> 
          </MultiDataTrigger.Conditions> 
          <Setter Property="Control.IsEnabled" Value="False"/> 
          <Setter TargetName="addFolderIcon" Property="Source" Value="Icon/Decoration/folder.png"/> 
         </MultiDataTrigger> 
       </ControlTemplate.Triggers> 
     </ControlTemplate> 
</Button.Template> 
</Button> 

Quand je lance le programme, il affiche le code d'erreur: "Impossible de trouver la source pour la liaison avec référence", et les conditions return false pour la deuxième condition (elementName = allAccountsBtn)

Pourquoi cela se produit-il?

De toute façon puis-je me référer pour obtenir la propriété IsChecked de RadioButton nommé dynamiquement et généré?

+0

Si j'ajoute un bouton radio dans mon xaml, il peut être détecté, donc le problème est maintenant, ElementName ne peut pas trouver le contrôle généré dynamiquement. – VHanded

Répondre

1

Localisons le problème. Essayez d'ajouter RadioButton directement dans XAML à votre GridPanel, pas en C#. Si l'erreur persiste, le problème n'est pas lié à la manière dynamique d'ajouter un contrôle.

Je pense qu'il y a un problème avec la 'visibilité' des contrôles sous les modèles. Vous pouvez appeler votreButton.ApplyTemplate() pour forcer la construction de l'arborescence visuelle. Mais je ne sais pas comment cela se fait dans le XAML.

+0

Oui, le problème est le RadioButton généré dynamiquement. J'ajoute RadioButton localement, et il n'y a pas d'erreur. J'appelle GridPanel.ApplyTemplate() après avoir appelé GridPanelChildren.Add (allAccountsBtn), rien ne se produit. Même chose pour allAccountsBtn.ApplyTemplate() ... Je dois inclure le RadioButton dynamiquement, car les données proviennent de la base de données. – VHanded

+0

Lecture de quelque part, le contrôle généré dynamiquement a un espace de noms différent avec un contrôle local, mais je n'ai aucune idée de la façon de traiter cet indice .. – VHanded

+0

Tout va bien, j'ai une solution de contournement pour cela. Merci. – VHanded

2

Je remarque que vous êtes mise Name propriété sur votre objet généré dynamiquement à « allAccountBtn » (singulier « Compte »), mais votre ElementName de XAML fait référence à un « allAccountsBtn » (« Comptes » au pluriel). Essayez de les changer pour être le même.