2010-03-27 8 views
0

J'ai un TreeView auquel j'associe un ContextMenu. Ce menu contextuel a un élément dont la propriété IsChecked que je veux lier à mon ViewModel. Comme j'utilise un arbre, chaque arbre est lié à une sous-propriété de mon ViewModel.WPF Treeview contextmenu Liaison IsChecked MVVM

Dans la fenêtre de sortie de VS2010 je vois cette erreur de liaison de données:

erreur de chemin de BindingExpression: 'IsAutoStart' propriété introuvable sur 'objet' '' HostMgmtViewModel '(HashCode = 12565727). BindingExpression: Path = IsAutoStart; DataItem = 'HostMgmtViewModel'

Cela montre clairement qu'il essaie de se lier à mon ViewModel et non aux données associées de l'arbre. Comment me lier à l'objet correct? Souvenez-vous que mon menu contextuel est associé à TreeView entier et non à l'arbre spécifique.

---------- Modifier

Comme xandy a souligné ci-dessous la résolution de mon problème était de lier la IsChecked comme ceci:

{Binding Path=PlacementTarget.SelectedItem.IsDisabledStart, Mode=OneWay, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}} 

Répondre

3
<TreeView Name="tview" Grid.Row="0" Tag="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem}"> 
     <TreeView.ContextMenu> 
      <ContextMenu> 
       <MenuItem Name="miC" Header="{Binding Path=Tag.Key}" DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"></MenuItem> 
      </ContextMenu> 
     </TreeView.ContextMenu> 
    </TreeView> 

Cette est l'extrait de code de travail que j'ai. Courtoisie de [ceci]. 1 Tout ce dont vous avez besoin est de changer le chemin de liaison dans l'étiquette. Je lie actuellement Treeview à un dictionnaire, donc c'est la propriété Key de celui-ci. Il ne devrait pas avoir de problème à se lier à des collections d'objets. Une conclusion intéressante est que le menu contextuel ne fait pas partie de l'arbre des éléments et que cela cause le problème. Je pourrais lier la zone de texte sans problème:

<TextBlock Grid.Row="1" DataContext="{Binding ElementName=tview, Path=SelectedItem}"> 
     <TextBlock.Text> 
      <Binding Path="Key" /> 
     </TextBlock.Text> 
    </TextBlock> 

Mais il ne fonctionne pas si pour menuitem si je mets la même chose.

+0

Et cette liaison va dans le ContextMenu? Lorsque j'essaie que j'obtiens cette erreur: Une 'liaison' ne peut pas être utilisée dans une collection 'ItemCollection'. Une 'liaison' ne peut être définie que sur un DependencyProperty d'un DependencyObject. – BrettRobi

+0

BTW, Ma réponse précédente est supposée faire comme l'exemple de bloc de texte ci-dessus, mais appliquer sur l'en-tête de menuitem. Aucune erreur n'est rencontrée avec le menuitem mais cela ne fonctionne pas. Vous obtenez une erreur DependencyObject ... car vous liez la source de données, mais pas la propriété. – xandy

+0

Merci xandy, votre échantillon m'a donné la bonne réponse. J'ai fini par lier l'élément de menu IsChecked à ceci: {Binding Path = PlacementTarget.SelectedItem.IsAutoStart, Mode = OneWay, RelativeSource = {RelativeSource AncestorType = {x: Type ContextMenu}}} – BrettRobi