TreeView ContextMenu没有触发事件(ContextMenu打开事件没有激活),我正在尝试Caliburn.Micro.Telerik约定未解决的问题。
TreeViewItemTemplate
<HierarchicalDataTemplate x:Key="TreeViewItemTemplate" ItemsSource="{Binding Types}"
ItemTemplateSelector="{StaticResource NamespaceItemTemplateSelector}">
<StackPanel Orientation="Horizontal">
<Path
Data=""
Height="11.458" Margin="0,0,5,0" RenderTransformOrigin="0.5,0.5" Stretch="Fill"
UseLayoutRounding="False" Width="11.264">
<Path.Fill>
<SolidColorBrush Color="#FF333333">
<SolidColorBrush.RelativeTransform>
<MatrixTransform Matrix="Identity" />
</SolidColorBrush.RelativeTransform>
<SolidColorBrush.Transform>
<MatrixTransform Matrix="Identity" />
</SolidColorBrush.Transform>
</SolidColorBrush>
</Path.Fill>
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform />
<TranslateTransform />
</TransformGroup>
</Path.RenderTransform>
</Path>
<TextBlock Text="{Binding Header}" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}">
<TextBlock.ContextMenu>
<ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}" cal:Message.Attach="[Event Opened] = [Action Opened($dataContext)]" >
<MenuItem Header="NewChild" cal:Message.Attach="NewChild($datacontext)"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</StackPanel>
的TreeView
<TreeView x:Name="TreeView" ItemTemplate="{StaticResource TreeViewItemTemplate}" ItemsSource="{Binding Source}"/>
答案 0 :(得分:4)
在我告诉你问题是什么之前我想指出你上传的代码版本与你在问题中发布的版本有点不同。
好的,问题在于模板的这一部分:
<TextBlock Text="{Binding Header}" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}">
<TextBlock.ContextMenu>
<ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}" cal:Message.Attach="[Event Opened] = [Action Opened($dataContext)]" >
<MenuItem Header="NewChild" cal:Message.Attach="NewChild($datacontext)"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
要修复它,您需要将其替换为此修改版本:
<TextBlock Text="{Binding Header}" Tag="{Binding DataContext, RelativeSource={RelativeSource Self}}">
<TextBlock.ContextMenu>
<ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=PlacementTarget.Tag}" cal:Message.Attach="[Event Opened] = [Action ContextMenuOpened($source)]">
<MenuItem Header="New" cal:Message.Attach="[Event Click] = [Action ClickMenuItem($source)]"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
问题是由三个问题引起的:
<ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}"
中,Path=UIElement.Tag
导致绑定错误,因为类型ContextMenu
上没有名为UIElement
的属性。相反,您必须使用PlacementTarget
属性替换它,该属性表示打开上下文菜单的用户界面中的元素。ShellViewModel
上,因为在模板中,您将Action.Target
设置为DataContext
后面的TextBlock
,实际上是NamespaceViewModel
你的情况,所以这些方法应该放在NamespaceViewModel
。ContextMenuOpened
方法是这样的:void ContextMenuOpened(sender args, RoutedEventArgs args);
但是在模板中你正在调用这样的方法:[Action ContextMenuOpened($source)]
发送方法FrameworkElement
导致事件(在这种情况下为ContextMenu
),因此您应将此事件的方法签名更改为:void ContextMenuOpened(ContextMenu source)
或更一般的void ContextMenuOpened(FrameworkElement source)
。 <强>要点:强>
PlacementTarget
属性。NamespaceViewModel
。最后:如果您想了解有关操作和操作消息以及传递给哪些参数的所有内容,那么您应该真正阅读有关Actions的文档Wiki。