2011-01-03 4 views
4

Ich habe derzeit ein UserControl, das das MVVM-Modell verwendet.TreeView ContextMenu MVVM-Bindung

In diesem Steuerelement gibt es eine TreeView, die einige Elemente anzeigt. Ich habe eine HierarchicalDataTemplate für diese TreeView hinzugefügt und in dieser Vorlage ist ein ContextMenu für die Items.

Im ViewModel, das ist DataContext des Steuerelements (namens RestoresTreeViewControl) ist ein Befehl, an den ich einen der Menüpunkte binden möchte. Was ich getan habe scheint jedoch nicht zu funktionieren. Ich bekomme das Übliche kann keine Quelle für verbindliche Referenz finden.

Hier ist das Bit des Codes für die Datatemplate, die versucht hat, den EditDatabaseCommand an eines der Menüelemente zu binden.

<HierarchicalDataTemplate DataType="{x:Type model:Database}" > 
        <StackPanel> 
         <TextBlock Text="{Binding Name}" > 
          <TextBlock.ContextMenu> 
           <ContextMenu> 
            <MenuItem Header="Edit" Command="{Binding ElementName=RestoresTreeViewControl, Path=DataContext.EditDatabaseCommand}" /> 
            <MenuItem Header="Delete"/> 
            <Separator/> 
            <MenuItem Header="Test Connection"/> 
           </ContextMenu> 
          </TextBlock.ContextMenu> 
         </TextBlock> 
        </StackPanel> 
       </HierarchicalDataTemplate> 

Hier ist ein Abschnitt des ViewModel, wo der Befehl ist.

public ICommand EditDatabaseCommand { get; private set; } 
+0

Das gleiche Problem hier! Das scheint mir fast ein Fehler zu sein, ich habe für immer mit dem Kontext-Menü herumgespielt, es funktioniert einfach nicht ... – lukebuehler

+0

Ah ich denke ich habe es gefunden, siehe meine Antwort. – lukebuehler

Antwort

0

Sie können versuchen, die Bindung Tracing:

xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
... 
{binding ... diag:PresentationTraceSources.TraceLevel="High"} 

Allerdings erfordern die Benutzer Ihrer Kontrolle (auch wenn es nur um sich selbst ist) jede Instanz von „RestoresTreeViewControl“ eher lästig zu nennen.

Versuchen:

{Binding Path=... RelativeSource={ FindAncestor, AncestorType={x:TheRestoresTreeViewControlType}} } 
3

Leider ist der ContextMenu ist nicht in der VisualTree, so ist es nicht Ihre Datacontext gehen zu sehen. Was Sie tun können, ist so etwas wie diese (kopiert von hier: MVVM binding command to contextmenu item)

<Button Height="40" Margin="0,2,0,0" CommandParameter="{Binding Name}" 
Tag="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
     AncestorType={x:Type UserControl}}}" Command = "{Binding 
     RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, 
     Path=DataContext.ConnectCommand}"> 
     <Button.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Remove" 
       CommandParameter="{Binding Name}" 
      Command="{Binding Path=PlacementTarget.Tag.DataContext.RemoveCommand, 
      RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/> 
      </ContextMenu> 
</Button.ContextMenu> 

So einfach PlacementTarget.Tag benutzen, um Ihr Ansichtsmodell zu finden.