【问题标题】:TreeView ContextMenu not fired eventsTreeView ContextMenu 未触发事件
【发布时间】:2013-07-16 05:19:30
【问题描述】:

TreeView ContextMenu 未触发事件(ContextMenu Opened 事件未触发),我正在尝试 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 x:Name="TreeView" ItemTemplate="{StaticResource TreeViewItemTemplate}" ItemsSource="{Binding Source}"/>

【问题讨论】:

  • 您的问题是事件未触发还是 Caliburn.Micro 的约定不适用于您的上下文菜单?
  • 感谢您的回复,Caliburn.Micro 约定有效,但 ContextMenu 和 MenuItem 事件未触发。
  • @Sniffer 没有解决办法?如果你想上传项目。请帮我。谢谢。
  • 我想帮助你,但问题是你使用的是 Telerik 控件,而我没有许可证。如果您可以使用 WPF TreeView 控件复制此问题,然后上传一个版本,我将对其进行研究。
  • 感谢回复,此问题存在于标准 ContectMenu 中,将第一篇文章编辑到标准 ContextMenu。

标签: caliburn.micro


【解决方案1】:

在告诉您问题出在哪里之前,我想指出您上传的代码版本与您在问题中发布的版本有点不同。

好的,问题就出在模板的这一部分:

<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. 在模板中,特别是在这行代码 &lt;ContextMenu cal:Action.TargetWithoutContext="{Binding RelativeSource={RelativeSource Self},Path=UIElement.Tag}" 中,Path=UIElement.Tag 导致绑定错误,因为类型 ContextMenu 上没有名为 UIElement 的属性。相反,您必须将其替换为 PlacementTarget 属性,该属性表示用户界面中打开上下文菜单的元素。
  2. 第二个问题是您将处理这些事件的方法放在了错误的类中。它们不应该出现在ShellViewModel 上,因为在模板中您将Action.Target 设置为TextBlock 后面的DataContext,在您的情况下实际上是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)

总结:

  1. 修复您的模板以使用PlacementTarget 属性。
  2. 将您的方法移至NamespaceViewModel
  3. 修复您的方法签名。

最后:如果您想了解有关操作和操作消息以及传递哪些参数的所有信息,那么您应该真正阅读有关 Actions 的文档 wiki。

【讨论】:

  • 解决了我的问题,感谢您的详尽解释。祝你好运。
  • 感谢您的回答。我无法弄清楚为什么它不起作用。我现在看得清楚了。
猜你喜欢
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多