2017-04-24 71 views
0

我有一个应用程序显示TreeViewTreeView有一个上下文菜单。我使用Caliburn.Micro作为MVVM框架。使用WPF和MVVM处理TreeViews上下文菜单

需要行cal:Message.Attach="[Event Click]=[Action Remove()]",以便在单击ContextMenu-Item时发生某些事情。此行使Caliburn.Micro在TreeItem的ViewModel中搜索名为Remove的方法。

但我希望点击ContextMenu Item将调用屏幕的ViewModel的方法Remove。怎么做?

<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

或者处理TreeItem本身的ViewModel中的删除逻辑(包括删除)更好DTO从数据库?) –

+1

有人有类似的问题[链接(http://stackoverflow.com/questions/24825722/bubbling-events-from-bound-viewmodel-goes-to-parent)。根据作者自己:[链接[(http://stackoverflow.com/questions/3650800/bind-a-command-to-a-button-inside-a-listview-with-caliburn-micro)。所以只需按照惯例调用它或像这样 ' –

+0

我发布了答案,如果这解决了您的问题 –

回答

1

试试这个:

<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> 

请参阅我的答案在这里获得更多信息:

Caliburn Micro Action inside ItemContainerStyle - No target found for method