none
HierarchicalDataTemplate中的command不起作用 RRS feed

  • 问题

  • <HierarchicalDataTemplate DataType="{x:Type m:DeviceContainer}" ItemsSource="{Binding Path=Devices}">
     <TextBlock Text="{Binding Path=DeviceType, Converter={StaticResource DeviceTypeToStringConverter}}" Foreground="{StaticResource DefaultForegroundColor}">
      <TextBlock.ContextMenu>
                             <ContextMenu Style="{StaticResource ContextMenuStyle}">
                                      <MenuItem Header="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.IsConnected, Converter={StaticResource DeviceIsConnectedToContextMenuHeaderConverter}}" 
                                                Command="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}},Path=DataContext.ConnectOrDisconnectDeviceTreeViewItemCommand}">
                                            
                                      </MenuItem>
                             </ContextMenu>
             </TextBlock.ContextMenu>
            </TextBlock>                          
    </HierarchicalDataTemplate>

    如代码所示,这个MenuItem的Command并不起作用,如果我把这个ContextMenu放在HierarchicalDataTemplate外面,那么这个MenuItem的Command是会起作用的,如果我不用Command,而用Click="......",那么这个Click是起作用的。

    Command的binding应该是没有问题的,因为在HierarchicalDataTemplate以外的Element上这个同样的binding是起作用的,但是我怀疑HierarchicalDataTemplate中这个Command的binding并没有找到源。

    另外,MenuItem中Header的这个binding是起作用的。

    是否在HierarchicalDataTemplate中的binding源无法使用RelativeSource={RelativeSource FindAncestor,AncestorType}?

    • 已编辑 duanying 2011年1月19日 1:56 修改
    2011年1月19日 1:49

答案

  • <Window.Resources>
            <c:CommandReference x:Key="ConnectOrDisconnectDeviceTreeViewItemCommand" Command="{Binding Path=ConnectOrDisconnectDeviceTreeViewItemCommand}"/>
        </Window.Resources>

    找到了一种解决方法,添加一个CommandReference,让MenuItem中的Command使用这个StaticResource。

    但是,我还是想搞明白上述问题。

    2011年1月19日 2:50
  • 你好 duanying,

    关于这个MenuItem的问题,我今天中午刚刚做了一个类似的,不过是英文的,如果有兴趣你可以参考一下,链接是:

    http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/36ce07fc-64de-4dc9-8012-3c4f03605c30/

    现在,我开始给你解释想搞明白的那个问题。

    这个问题的关键点就是ContentMenu是作为你一个popup的窗口出现在UI上的,因此,这个Popup和你原来的窗口并不是同一个VisualTree,关于这点你可以参考MSDN的这篇文档:

    http://msdn.microsoft.com/zh-cn/library/ms749018.aspx

    在“Popup 和 可视化数”部分你可以找到我这样说的原因。

    既然他们不在同一个VisualTree, 你的“RelativeSource={RelativeSource FindAncestor,AncestorType}?” 这部分代码是不会工作正常的,他是找不到你想要的“Ancestor”,所以他不会正常工作。

    关于如何解决这个问题,我想你自己已经给出一个很好的解决方案了,同样,在我给出的英文链接里面也有另一个解决方案你可以留作以后参考。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月20日 11:29
    版主

全部回复

  • <Window.Resources>
            <c:CommandReference x:Key="ConnectOrDisconnectDeviceTreeViewItemCommand" Command="{Binding Path=ConnectOrDisconnectDeviceTreeViewItemCommand}"/>
        </Window.Resources>

    找到了一种解决方法,添加一个CommandReference,让MenuItem中的Command使用这个StaticResource。

    但是,我还是想搞明白上述问题。

    2011年1月19日 2:50
  • 你好 duanying,

    关于这个MenuItem的问题,我今天中午刚刚做了一个类似的,不过是英文的,如果有兴趣你可以参考一下,链接是:

    http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/36ce07fc-64de-4dc9-8012-3c4f03605c30/

    现在,我开始给你解释想搞明白的那个问题。

    这个问题的关键点就是ContentMenu是作为你一个popup的窗口出现在UI上的,因此,这个Popup和你原来的窗口并不是同一个VisualTree,关于这点你可以参考MSDN的这篇文档:

    http://msdn.microsoft.com/zh-cn/library/ms749018.aspx

    在“Popup 和 可视化数”部分你可以找到我这样说的原因。

    既然他们不在同一个VisualTree, 你的“RelativeSource={RelativeSource FindAncestor,AncestorType}?” 这部分代码是不会工作正常的,他是找不到你想要的“Ancestor”,所以他不会正常工作。

    关于如何解决这个问题,我想你自己已经给出一个很好的解决方案了,同样,在我给出的英文链接里面也有另一个解决方案你可以留作以后参考。

     

    Best regards,


    Sheldon _Xiao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月20日 11:29
    版主