2009-04-28 6 views
3

J'ai un comportement étrange avec NameScopes dans WPF, j'ai créé un CustomControl appelé FadingPopup qui est une classe enfant de Window avec rien de spécial à l'intérieur.Comment fonctionne NameScope dans WPF?

<Window.Resources> 
    <local:FadingPopup> 
     <Button Name="prec" Content="ahah"></Button> 
     <Button Content="{Binding ElementName=prec, Path=Content}"></Button> 
    </local:FadingPopup> 
</Window.Resources> 

Dans cet extrait, la liaison ne fonctionne pas (toujours vide). Si je déplace ces boutons des ressources au contenu de la fenêtre comme ceci:

<Window ...> 
    <Button Name="prec" Content="ahah"></Button> 
    <Button Content="{Binding ElementName=prec, Path=Content}"></Button> 
</Window> 

La liaison fonctionne comme prévu.

Maintenant, j'ai essayé un mélange entre ces deux extraits:

<Window...> 
    <Window.Resources> 
     <local:FadingPopup> 
      <Button Name="prec" Content="Haha"></Button> 
     </local:FadingPopup> 
    </Window.Resources> 
    <Button Content="{Binding ElementName=prec, Path=Content}"></Button> 
</Window> 

Il fonctionne aussi bien.

Apparemment, si le bouton prec est dans les ressources, il s'enregistre lui-même dans le NameScope de la fenêtre. MAIS, il semble que la liaison essaye de résoudre ElementName avec le NameScope du FadingPopup (qui est null), ainsi la liaison ne fonctionne pas ...

Mon premier snipped fonctionne bien si je spécifie un NameScope dans mon classe FadingPopup:

static FadingPopup() 
{ 
    NameScope.NameScopeProperty.OverrideMetadata(typeof(FadingPopup), new PropertyMetadata(new NameScope())); 
} 

mais je n'aime pas cette solution parce que je ne comprends pas pourquoi, dans le premier extrait, prec est inscrit dans la NameScope de la fenêtre, mais ElementName est résolu avec le NameScope de FadingGroup (qui est null par défaut) ...

Est-ce que quelqu'un peut m'expliquer ce qui se passe? Pourquoi mon premier extrait ne fonctionne-t-il pas, si je ne spécifie pas un NameScope par défaut pour FadingGroup?

+0

Avez-vous essayé x: Name = "prec"? – user7116

+0

Pourriez-vous jamais trouver une solution à cela (que vous pourriez vous poster comme une réponse)? –

+1

Désolé, il a été de 6 ans, totalement oublié :( je ne pense pas que je trouve une explication, et juste utilisé NameScope.NameScopeProperty.OverrideMetadata (typeof (FadingPopup), nouvelle PropertyMetadata (nouvelle NameScope())) ; –

Répondre

-2

Vous devriez vérifier votre DataContext sur votre contrôle, faire quelque chose comme ceci et vous devriez être OK. Vous devrez peut-être ajouter un chemin, mais probablement pas.

<Window.Resources> 
    <local:FadingPopup DataContext="{Binding}"> 
     <Button Name="prec" Content="ahah"></Button> 
     <Button Content="{Binding ElementName=prec, Path=Content}"></Button> 
    </local:FadingPopup> 
</Window.Resources> 
+1

Cela ne fonctionne pas, le DataContext est utilisé lorsque nous ne spécifions pas le ElementName, et même si je n'utilise pas ElementName, je ne comprends pas pourquoi nous devons définir le DataContext à {Binding} parce que le DataContext devrait être automatiquement hérité du parent logique (ou parent visuel, je ne suis pas sûr). –

Questions connexes