J'essaie de faire fonctionner ma première application WPF à l'aide de MVVM, et j'ai rencontré un petit problème de liaison.WPF: Définition de DataContext d'un contrôle UserControl avec la liaison ne fonctionnant pas en XAML
La configuration est que j'ai vue & viewmodel qui contient les détails de l'utilisateur (le parent), et d'essayer de garder les choses simples que j'ai mis une partie de ce point de vue dans une vue séparée & viewmodel (l'enfant). La vue enfant est définie en tant que UserControl.
Le problème que je rencontre est de savoir comment définir le DataContext de la vue enfant (UserControl). Mon parent ViewModel a une propriété qui expose l'enfant ViewModel, comme ceci:
class ParentViewModel: INotifyPropertyChanged
{
public ChildViewModel childViewModel { get; set; }
//...
}
Dans le XAML pour moi parent (qui a son DataContext ensemble à la ParentViewModel), j'essaie de régler le DataContext de la vue enfant comme suit:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Cependant, cela ne fonctionne pas. Le DataContext de la vue enfant est défini sur le même DataContext que la vue parent (c'est-à-dire le ParentViewModel), comme si je ne le définissais pas du tout. J'ai aussi tenté de mettre le DataContext chez l'enfant lui-même voir, ce qui ne fonctionne pas aussi:
<UserControl x:Class="DietRecorder.Client.View.ChildView"
DataContext="childViewModel"
J'ai trouvé deux façons de contourner cela. De l'avis des enfants, je peux lier tout en incluant le ChildViewModel dans le chemin:
<SomeControl Visibility="{Binding Path=childViewModel.IsVisible}">
mais je ne veux pas le point de vue des enfants d'avoir ce niveau de conscience de la hiérarchie. Réglage du DataContext dans le code fonctionne aussi - cependant, je dois le faire après avoir montré la vue parent, sinon le DataContext se juste écrasé quand je l'appelle Show():
parentView.Show();
parentView.ChildView.DataContext = parentViewModel.childViewModel;
Ce code me fait aussi mal à l'aise, ce avec la violation de LOD et tout.
Il est juste le DataContext qui semble être le problème - je peux lier d'autres choses chez l'enfant, par exemple, j'essayé lier le FontSize à une propriété int juste pour le tester:
<views:ChildView
x:Name="ChildView"
FontSize="{Binding Path=someVal}"/>
Et que les travaux bien.
Mais je suis sûr que la liaison du DataContext devrait fonctionner - j'ai vu des exemples similaires de ce genre de chose. Ai-je manqué quelque chose d'évident ici? Y at-il une raison pour que cela ne fonctionne pas? Y a-t-il une faute d'orthographe quelque part? (J'ai renommé les choses pour votre bénéfice afin que vous ne puissiez pas m'aider de toute façon).
Toutes les pensées sont les bienvenues.
Modifier
Revoir ce code encore une fois, il semble que je l'ai fait une erreur quelque part, comme le XAML suivant dans la vue parent ne semble maintenant travailler:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Je suis Je ne sais pas pourquoi je ne pouvais pas le faire fonctionner à l'origine, ou ce que j'ai pu changer pour le faire fonctionner. Peut-être était-ce le problème INotifyPropertyChanged comme le suggère l'une des réponses. Eh bien, en avant et en haut ..
Bonne pensée, mais pas de joie j'ai peur. Je pensais que cela pourrait être quelque chose à voir avec la commande, mais l'enfant viewmodel devrait être disponible quand la liaison se produit - et cela fonctionne quand je définis la taille de la police en utilisant la propriété int, qui arrive en même temps. t utilisez PropertyChanged. –