使用WPF和MVVM处理TreeViews上下文菜单
问题描述:
我有一个应用程序显示TreeView
。 TreeView
有一个上下文菜单。我使用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>
答
有人有类似的问题“Bubbling” events from bound viewmodel goes to parent。
并根据作者本人Bind a Command to a Button inside a ListView with Caliburn.Micro。
因此,只要按照约定或者这样称呼它:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cal:ActionMessage MethodName="{Binding Name}" />
</i:EventTrigger>
</i:Interaction.Triggers>
+0
不幸的是它不起作用。没有效果。 –
答
试试这个:
<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
或者处理TreeItem本身的ViewModel中的删除逻辑(包括删除)更好DTO从数据库?) –
有人有类似的问题[链接(http://*.com/questions/24825722/bubbling-events-from-bound-viewmodel-goes-to-parent)。根据作者自己:[链接[(http://*.com/questions/3650800/bind-a-command-to-a-button-inside-a-listview-with-caliburn-micro)。所以只需按照惯例调用它或像这样 i:EventTrigger> ' –
我发布了答案,如果这解决了您的问题 –