TreeView ContextMenu未触发事件

时间:2013-07-16 05:19:30

标签: caliburn.micro

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}"/>

1 个答案:

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

问题是由三个问题引起的:

  1. 在模板中,特别是在这行代码<ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}"中,Path=UIElement.Tag导致绑定错误,因为类型ContextMenu上没有名为UIElement的属性。相反,您必须使用PlacementTarget属性替换它,该属性表示打开上下文菜单的用户界面中的元素。
  2. 第二个问题是您将处理这些事件的方法放在错误的类上。它们不应位于ShellViewModel上,因为在模板中,您将Action.Target设置为DataContext后面的TextBlock,实际上是NamespaceViewModel你的情况,所以这些方法应该放在NamespaceViewModel
  3. 第三个也是最后一个问题是您的方法签名错误,因此Caliburn.Micro无法找到它们。我的意思是你声明你的ContextMenuOpened方法是这样的:void ContextMenuOpened(sender args, RoutedEventArgs args);但是在模板中你正在调用这样的方法:[Action ContextMenuOpened($source)]发送方法FrameworkElement导致事件(在这种情况下为ContextMenu,因此您应将此事件的方法签名更改为:void ContextMenuOpened(ContextMenu source)或更一般的void ContextMenuOpened(FrameworkElement source)
  4. <强>要点:

    1. 修复模板以使用PlacementTarget属性。
    2. 将您的方法移至NamespaceViewModel
    3. 修复方法签名。
    4. 最后:如果您想了解有关操作和操作消息以及传递给哪些参数的所有内容,那么您应该真正阅读有关Actions的文档Wiki。