WPF: Réglage DataContext d'un UserControl avec la Liaison ne fonctionne pas dans le XAML
Que j'essaie de faire ma première application WPF, de travail en utilisant MVVM, et j'ai touché un peu contraignant problème.
La configuration est que j'ai une vision & viewModel qui détient les détails de l'Utilisateur (la maison mère), et pour essayer de garder les choses simples, j'ai mis une section de ce point de vue dans une vue séparée & viewModel (l'enfant). La vue enfant est défini comme un UserControl.
La question que je vais avoir est de savoir comment définir le DataContext de la vue enfant (UserControl). Mes parents ViewModel a une propriété qui expose l'enfant ViewModel, comme suit:
class ParentViewModel: INotifyPropertyChanged
{
public ChildViewModel childViewModel { get; set; }
//...
}
Dans le code XAML pour ma mère qui a du DataContext ensemble de la ParentViewModel), j'essaie de régler le DataContext de la vue enfant comme suit:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Toutefois, cela ne fonctionne pas. Le DataContext de la vue enfant est défini de la même DataContext de la vue parent (c'est à dire la ParentViewModel), comme si je n'étais pas à tous. J'ai aussi essayé le réglage de la DataContext de la vue enfant lui-même, qui a également ne fonctionne pas:
<UserControl x:Class="DietRecorder.Client.View.ChildView"
DataContext="childViewModel"
J'ai trouvé un couple de façons de contourner cela. Dans la vue enfant, je peux lier de tout, y compris la ChildViewModel dans le chemin d'accès:
<SomeControl Visibility="{Binding Path=childViewModel.IsVisible}">
mais je ne veux pas de l'enfant en vue de ce niveau de prise de conscience de la hiérarchie. Réglage de la DataContext dans le code fonctionne aussi - cependant, je dois faire après avoir montré la vue parent, sinon le DataContext est juste écrasé quand je l'appelle Show():
parentView.Show();
parentView.ChildView.DataContext = parentViewModel.childViewModel;
Ce code me fait aussi mal à l'aise, ce qui avec le niveau de détail de la violation et de tous.
C'est juste le DataContext qui semble être le problème - je peux lier d'autres choses de l'enfant, par exemple, j'ai essayé de liaison de la FontSize int propriété juste pour le tester:
<views:ChildView
x:Name="ChildView"
FontSize="{Binding Path=someVal}"/>
Et qui fonctionne très bien.
Mais je suis sûr que la liaison du DataContext de travail - j'ai vu des exemples similaires de ce genre de chose. Ai-je manqué quelque chose d'évident ici? Est-il une raison pour laquelle cela ne fonctionne pas? Est-il une faute de frappe quelque part? (J'ai renommé les choses à votre avantage afin que vous ne serez pas en mesure de m'aider de toute façon).
Toutes les pensées de bienvenue.
Modifier
L'examen de ce code, il semble que j'ai fait une erreur quelque part, comme le code XAML suivant dans la vue parent semble maintenant au travail:
<views:ChildView
x:Name="ChildView"
DataContext="{Binding childViewModel}"/>
Je ne sais pas pourquoi je ne pouvais pas le faire fonctionner à l'origine, ou ce que je pourrais avoir changé pour le faire fonctionner. C'était peut-être le INotifyPropertyChanged question comme l'une des réponses suggère. Eh bien, à partir et vers le haut..
OriginalL'auteur Grant Crofton | 2010-04-18
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que c'est parce que le childViewModel propriété ne déclenche pas l'événement PropertyChanged. Lorsque la liaison est évalué, il est possible que cette propriété est null (dans ce cas, le DataContext se fait tout seul à la maison mère). Lorsque le childViewModel est instancié plus tard, aucun événement PropertyChanged est élevé, et la liaison n'est jamais informé qu'il y a maintenant un DataContext.
Essayer de lever événement PropertyChanged dans le childViewModel propriété.
Cheers,
Laurent
OriginalL'auteur LBugnion
Ce n'est pas une réponse à la question, mais peut aider d'autres personnes dans la même situation.
J'ai frappé exactement ce problème et a trouvé que la
approche travaillé (même si j'ai trouvé que ça fonctionnait avant de faire Afficher()), mais a eu les mêmes scrupules à ce sujet que l'original interlocuteur donc essayé le
approche, qui semble également fonctionner. Mais ensuite, j'ai essayé de revenir à l'original du code et original XAML de nouveau, et maintenant, soudain, elle a également travaillé. Ce miroir de l'original interlocuteur du comportement où l'auteur a pensé qu'ils avaient fait une erreur quelque part que le XAML semblait commencer à travailler pour aucune raison évidente.
Le seul changement que je vois c'est que Visual Studio est maintenant montrant des exemples de données dans le contrôle UserControl au moment de la conception, de sorte qu'il a en cache des données d'exemple de quelque part, et qui semble pour le faire fonctionner. Je ne suis pas sûr de les deux modifications apportées cela se produit, malheureusement.
L'apparence des données de l'échantillon me fait me demander si le problème est lié à l'utilisation de d:DataContext, que j'ai dans la mère et de l'enfant les fichiers XAML, mais c'est juste de la spéculation.
OriginalL'auteur NickN
Je cherchais la même chose et j'ai trouvé un moyen de le faire. En gros, j'ai lié le DataContext de l'enfant pour le DataContext de certains parents (la fenêtre) à l'aide de
où j'ai mis
x:Name="_topLevel"
sur certains parent de contrôle (la fenêtre).J'ai essayé d'utiliser
RelativeSource/FindAncestor
au lieu de ElementName mais il n'a pas de travail, mais c'est probablement de ma faute.Se sent comme un hack pour moi, mais c'est mieux que la liaison à haut niveau modèle de vue.
OriginalL'auteur stevesp4644