2010-06-17 15 views
1

Salut J'ai une fenêtre mainView qui a son dataContext définie à son propre viewModel.WPF Usercontrol interaction avec parent view/viewmodel

Sur ce ViewModel est une propriété DateTime qui à son tour est lié à un calendrier sur ma vue principale en utilisant la liaison bidirectionnelle.

<toolkit:DatePicker DateSelected="{Binding mainDateTimeProperty, Mode=TwoWay}" /> 

Tout cela est très bien jusqu'à présent. Lors de la modification de ma propriété datetime, je crée une liste qui est ensuite liée à une grille de données ailleurs dans la vue principale. Tout cela fonctionne très bien.

Ma question concerne un contrôle utilisateur que je veux ajouter à la vue principale. Je voulais que ce contrôle soit autonome, donc je l'ai créé avec son propre viewmodel mais il faut aussi avoir accès à mainDateTimeProperty

Je pensais que la meilleure façon de procéder serait de créer un dependencyProperty sur le contrôle usercontrol et quand je créerais mon contrôle dans la vue principale, je lie le dp au datetime comme suit.

<uc:MyNewUserControl DateProperty="{Binding mainDateTimeProperty}" /> 

Le problème est comment puis-je le usercontrol maintenir datacontext avec elle est viewmodel mais ont encore la propriété de dépendance liée à une propriété sur le modèle de la vue principale?

Espérons que cela soit clair. Peut poster plus de code si nécessaire. Vous cherchez une approche de meilleure pratique si possible.

Merci beaucoup pour tout conseil.

Répondre

3

Essayez

<uc:MyNewUserControl DateProperty="{Binding Parent.DataContext.mainDateTimeProperty, Mode=TwoWay}" /> 

Modifié: Désolé, le code previos était incorrect. La liaison correcte est

<uc:MyNewUserControl DateProperty="{Binding Path=Parent.DataContext.mainDateTimeProperty, RelativeSource={RelativeSource Self}, Mode=TwoWay} /> 
+0

OK merci. Je vais essayer. Donc, sur une autre note, diriez-vous que l'utilisation de l'approche de propriété de dépendance et de la liaison comme ceci est la bonne façon de faire les choses dans ce genre d'approche de contrôle parent/enfant? – obaylis

+0

Pourquoi pas? Si vous voulez garder votre xaml à l'écart des bindings comme ceci, vous pouvez exposer la propriété du modèle de vue parent via le modèle de vue enfant si le modèle de vue parent a déjà un modèle de vue enfant agrégé et que le modèle de vue enfant fait référence au parent. Par ailleurs, l'utilisation de la propriété Parent pour obtenir une référence à la vue parente peut être incorrecte dans certains cas, par exemple si votre vue enfant n'est pas placée directement par le parent. Si c'est le cas, utilisez la liaison suivante: {Binding Path = DataContext.mainDateTimeProperty, RelativeSource = {RelativeSource Type = FindAncestor, AncestorType = {x: Type uc: YourParentViewModelType}}} – STO