2017-09-29 2 views
0

Voici ma situation. J'ai une vue et un ViewModel. Le DataContext de la vue est défini sur ViewModel. En raison de l'utilisation d'un contrôle tiers, je suis obligé de mettre du code dans le code-behind. Dans le code-behind je crée un objet appelé StraightConnectorTool.Liaison d'un contrôle lorsque la vue est liée à un ViewModel?

Dans ma vue, j'ai besoin de lier cet objet. Si le DataContext de View est défini dans le code-behind:

DataContext = this; 

La liaison suivante fonctionne correctement.

<BarItemToolBehavior ActiveTool="{Binding ActiveTool, ElementName=diagram, Mode=TwoWay}" 
           Tool="{Binding StraightConnectorTool}"/> 

Lorsque diagramme est le nom du contrôle tiers sur View et ActiveTool est l'une de ses propriétés. Toutefois, si le DataContext de View est défini sur ViewModel, la liaison ne fonctionne pas. Je suis bloqué en essayant de comprendre comment lier à la vue quand DataContext est défini sur le ViewModel. Des idées?

+0

'this.DataContext = this;' est le cancer de WPF MVVM. [Cet article explique pourquoi] (http://blog.scottlogic.com/2012/02/06/a-simple-pattern-for-creating-re-useable-usercontrols-in-wpf-silverlight.html) remarquez que c'est un peu long, mais la chimiothérapie aussi. – Will

Répondre

1

Ce n'est pas une bonne pratique, mais vous pouvez lier le DataContext de BarItemToolBehavior à la vue. Soit par nom dans le code derrière ou en XAML en utilisant RelativeSource FindAncestor pour trouver la vue. Une meilleure solution consisterait à déplacer cet objet vers la machine virtuelle à laquelle elle appartient.

+0

L'utilisation de RelativeSource FindAncestor a fonctionné. Merci pour le conseil. BTW, je suis d'accord avec vous sur le déplacement de l'objet à la VM, mais c'est un autre problème ... – cce1911