2016-09-21 1 views
1

Ich habe folgendes Layout:Bind MenuItems Befehl zum Benutzersteuerelemente Datacontext

public class ParentUserControl : UserControl{...} 

<ParentNameSpace:ParentUserControl 
... 
DataContext={Binding MyViewModel ....} 
> 
<TreeView ...>     
<HierarchicalDataTemplate  
     .... > 
       <StackPanel> 
        <StackPanel.ContextMenu> 
         <ContextMenu> 
          <MenuItem Header="item" 
          Command="{Binding DataContext.SomeCommandInMyViewModel, 
           RelativeSource={RelativeSource 
           AncestorType={x:Type ParentUserControl}}}"/> 
         </ContextMenu> 
        </StackPanel.ContextMenu> 
        <TextBlock Text="{Binding Path=Name}"/> 
       </StackPanel> 
      </HierarchicalDataTemplate> 
</TreeView> 

Im Versuch, aus dem Kontext eines TreeViewItem einen Befehl des Usercontrols Ansichtsmodell zu nennen ohne Erfolg. Es sagt mir, dass ParentUserControl in einem WPF-Projekt nicht unterstützt wird. Wenn ich AncestorType in UserControl ändere, wird der Befehl nicht aufgerufen. Gibt es etwas, das ich vermisse?

Antwort

0

Dies ist, weil ContextMenu kein Teil des visuellen Baumes ist. Der einfachste Weg, um Code-behind ohne Änderung ist dies:

einen Namen ParentUserControl geben:

<ParentNameSpace:ParentUserControl x:Name="ParentRoot" ... > 

Mit dieser Bindung:

Command="{Binding Source={x:Reference Name=ParentRoot}, Path=DataContext.SomeCommandInMyViewModel}" 

aktualisieren für ohne x:Name Attribut.

Sie können die Eigenschaft ContextMenu.PlacementTarget verwenden, die in Ihrem Fall auf StackPanel zeigt. Dann können Sie die Eigenschaft Tag für den Zugriff auf Ihr Ansichtsmodell verwenden.

<StackPanel Tag="{Binding RelativeSource={RelativeSource AncestorType=ParentNameSpace:ParentUserControl}, Path=DataContext}"> 

Und Befehl:

Command="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.Tag.SomeCommandInMyViewModel}" 
+0

Meine Basisklasse ist abstrakt und leitet sich von einer anderen abstrakten Klasse mit einem Konstruktor einzigen Parameter, die Ursachen: Der Typ ‚ParentUserControl‘ kein Name-Attribut haben. Werttypen und -typen ohne Standardkonstruktor können als Elemente in einem ResourceDictionary verwendet werden. Ich möchte nicht die Basisklassen ändern, haben Sie eine andere Idee, um dies zu lösen: /? – Milleu

+0

@Milleu Ich habe die Antwort aktualisiert. – Sam

+0

super danke !, es funktioniert !! :) zu meinem Verständnis - ich könnte nicht die Vorfahren im ContextMenu verwenden, weil es in einem anderen visuellen Baum (anderer Prozess oder etwas?) - so muss ich den Tag (oder den Namen) definieren, um auf das ViewModel zuzugreifen. Ich habe ein paar HierarchicalDataTemplates kann ich das Tag einmal in Treeview definieren oder muss das Tag immer im Eigentümer-Element definiert werden (hatte keinen Erfolg, das Tag in Treeview zu verschieben und AncestorType in TreeView zu ändern) – Milleu

Verwandte Themen