2017-04-24 3 views
0

Ich habe eine Anwendung, die eine TreeView zeigt. Die TreeView hat ein Kontextmenü. Ich verwende Caliburn.Micro als MVVM-Framework.Umgang TreeViews Kontextmenü mit WPF und MVVM

Die Zeile cal:Message.Attach="[Event Click]=[Action Remove()]" ist erforderlich, damit etwas passiert, wenn auf das ContextMenu-Item geklickt wird. Diese Zeile bewirkt, dass Caliburn.Micro im ViewModel des TreeItem nach einer Methode mit dem Namen Remove sucht.

Aber ich möchte, dass der Klick auf ContextMenu Item ruft die Methode Remove des ViewModel des Bildschirms. Wie geht das?

<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}"> 
      <TextBlock.ContextMenu> 
       <ContextMenu> 
        <MenuItem cal:Message.Attach="[Event Click]=[Action Remove()]" Name="Remove" Header="Remove item" /> 
       </ContextMenu> 
      </TextBlock.ContextMenu> 
     </TextBlock> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 
+0

Or ist es besser, Löschlogik innerhalb des ViewModel des TreeItem selbst zu handhaben (einschließlich Entfernen der DTO aus der Datenbank?) –

+1

Jemand hatte das ähnliche Problem [link (http://stackoverflow.com/questions/24825722/bubbling-events-from-bound-viewmodel-goes-to-parent). Und laut Autor selbst: [link [(http://stackoverflow.com/questions/3650800/bind-a-command-to-a-button-inside-a-listview-with-caliburn-micro). Rufen Sie es einfach per Konvention oder wie folgt auf: ' –

+0

Ich habe die Antwort geschrieben, wenn dies Ihr Problem gelöst –

Antwort

1

Try this:

<TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}"> 
      <TextBlock.ContextMenu> 
       <ContextMenu> 
        <MenuItem Tag="{Binding RelativeSource={RelativeSource AncestorType=TreeView}}" 
           cal:Action.TargetWithoutContext="{Binding Path=PlacementTarget.Tag.DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" 
           cal:Message.Attach="[Event Click]=[Action RemoveResource()]" Name="Remove" Header="Remove item" /> 
       </ContextMenu> 
      </TextBlock.ContextMenu> 
     </TextBlock> 
    </HierarchicalDataTemplate> 
</TreeView.ItemTemplate> 

Bitte lesen Sie meine Antwort hier für weitere Informationen:

Caliburn Micro Action inside ItemContainerStyle - No target found for method