2010-09-02 21 views
0

J'essaie ce qui devrait être une liaison facile dans mon contrôle utilisateur:Reliure contenu de l'étiquette au champ de chaîne auto mais aucun résultat

<UserControl x:Class="MyApp.FlowNode" ...> 
    <StackPanel> 
     <Label Content="{Binding Path=Header, RelativeSource={RelativeSource Self}}" /> 
    </StackPanel> 
</UserControl> 

Avec l'être code sous-jacent:

public partial class FlowNode : UserControl 
{ 
    public FlowNode() 
    { 
     InitializeComponent(); 
    } 

    public string Header { get { return "Testing"; } }; 
} 

Cependant, l'étiquette reste vide. Qu'est-ce que je fais mal?

Répondre

0

Essayez d'utiliser

{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type FlowNode}}}. 
+0

Vous devez également ajouter un 'xmlns' pour l'espace de noms dans lequel' FlowNode' est défini. – SLaks

0

Dans votre constructeur, définissez le DataContext de UserControl sur lui-même. "this.DataContext = ceci". Et supprimez le RelativeSource dans votre liaison.

+1

Vous ne devriez jamais faire cela dans un UserControl - c'est une recette pour les bogues. Lorsque vous définissez le DataContext sur lui-même, vous cassez les ensembles de liaisons sur une instance du contrôle qui utilise le DataContext hérité en surpassant la valeur héritée. Puisque vous le faites de l'intérieur, il est impossible de voir à partir du XAML qui utilise le contrôle. Au lieu de cela, définissez le DataContext d'un élément nommé dans le code XAML de UserControl, comme une grille racine. –

+0

Je suis tout à fait d'accord dans votre commentaire sur "this.DataContext = this" n'est généralement pas une bonne pratique de conception, je suppose que je suggère simplement à l'OP que c'est la façon la plus directe de résoudre son problème basé sur les faits au dessus. =) – ASanch

2

{RelativeSource Self} fait référence à l'instance Label, pas votre contrôle utilisateur. Au lieu d'utiliser un RelativeSource, vous devez définir le DataContext UserControl sur lui-même, comme suggéré par karmicpuppet.

0

La façon la plus pratique d'avoir accès à « Me »/« ce » en XAML à mon avis, est de mettre un nom sur votre commande: < UserControl x: Class = "MyApp.FlowNode" ... Name = "MyFlowNode"> Et puis, si vous liez à la propriété de votre contrôle ou dp, vous utilisez la syntaxe ElementName.

Ainsi, vous ne cassez pas le DataContext de votre contrôle.

Il peut y avoir un moyen de relier RelativeSource FindAncestor, mais je ne vois pas d'avantages par rapport à celui-ci.

Mais ne pas définir DataContext de votre contrôle à lui-même, sinon il perdra conscience de son DataContext.