2010-12-06 42 views
0

Dans un question I had posted auparavant concernant la liaison de données et UserControls, j'avais des problèmes pour obtenir des propriétés simples afin de pouvoir changer les couleurs, la taille, etc. Kent m'a donné de bons conseils et cela a bien fonctionné. J'ai ensuite écrit un nouveau UserControl, et en utilisant ses conseils, cela a fonctionné aussi bien.Problèmes de liaison de données de commande avec UserControl - séparation de DataContext?

Maintenant, je suis à l'étape suivante - commandes de liaison de données. Ma structure actuelle ressemble à ceci:

fenêtre --contains -> UserControlB --contains -> UserControlA

Maintenant propriétés dans UserControlA travaillent liaison de données grand, et mon UserControlB expose ces mêmes propriétés de sorte que la fenêtre peut change UserControlA indirectement. Le problème est que DataContext de UserControlB est défini comme ceci:

<UserControl x:Name="root"> 
    <Grid DataContext="{Binding ElementName=root}"> 
    ... 
    <Button Command="{Binding MyCommand}" /> 
    ... 
    </Grid> 
</UserControl> 

Mais je veux MyCommand à être lié à mon ViewModel. Je pensais qu'il était possible de définir les DataContexts séparément, mais comment puis-je obtenir les boutons pour pointer vers mon ViewModel en XAML?

J'ai trouvé un related post, mais je n'avais pas l'air de ce que je voulais faire. Je veux créer le ViewModel en code, pas en XAML.

Répondre

1

Votre liant devrait ressembler à ceci:

<Button Command="{Binding Path=DataContext.MyCommand, RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType={x:Type TypeOfYourControlWithViewModelDataContext}}"/> 
+0

Merci, je vais faire un essai. Je devrais commencer à expérimenter avec des choses, mais je suis toujours complètement perdu en essayant de comprendre comment tout est connecté, et quelle est l'approche logique pour définir les Ancêtres. – Dave

+0

Hmm ... pas de chance pour le moment. Je reçois cette erreur: 'System.Windows.Data Erreur: 4: Impossible de trouver la source pour la liaison avec la référence 'RelativeSource FindAncestor, AncestorType =' Company.MyPlugin ', AncestorLevel =' 1 ''. BindingExpression: Path = DataContext.MyCommand; DataItem = null; l'élément cible est 'Button' (Name = ''); La propriété target est 'Command' (tapez 'ICommand') '. – Dave

+0

Il semblerait que le datacontext ne soit toujours pas correct. Vous devez définir le type de source relative sur tout ce qui aura le datacontext du viewmodel. De même, il semble que vous puissiez l'obtenir automatiquement si vous ne surchargez pas le datacontext de votre Grid par rapport au contrôle, mais que vous pouvez simplement laisser le datacontext s'écouler naturellement du parent. – poindexter12