【问题标题】:Context menu with binding on name具有名称绑定的上下文菜单
【发布时间】:2012-08-07 12:35:08
【问题描述】:

我正在尝试按名称将元素绑定到 ContextMenu 中的 MenuItem。要绑定的元素:

<UserControl x:Class="ATCheckerView.TestsPropagate"
         x:Name="TestPropagateRoot" ...

工作版本:

        <HierarchicalDataTemplate x:Key="SchemTemplate">
            <Button Command="{Binding ElementName=TestPropagateRoot, Path=DataContext.vclient.OpenInViewer}" />               
        </HierarchicalDataTemplate>

不工作:

           <HierarchicalDataTemplate x:Key="SchemTemplate">                
            <TextBlock Text="{Binding path}">
                <TextBlock.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="{Binding ElementName=TestPropagateRoot}"
                                  Command="{Binding ElementName=TestPropagateRoot, Path=DataContext.vclient.OpenInViewer}"
                                  CommandParameter="{Binding}" />
                    </ContextMenu>
                </TextBlock.ContextMenu>
            </TextBlock>
        </HierarchicalDataTemplate>

【问题讨论】:

    标签: wpf data-binding icommand


    【解决方案1】:

    here 是一个类似的问题和一个很好的答案,它展示了如何处理上下文菜单绑定的一些方法。

    顺便说一句,大多数时候使用 PlacementTarget Binding,例如

            <TextBlock Text="{Binding path}">
                <TextBlock.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Test"
                                  Command="{Binding Path=PlacementTarget.DataContext.vclient.OpenInViewer, 
                                                    RelativeSource={RelativeSource AncestorType=ContextMenu}}"
                                  CommandParameter="{Binding}" />
                    </ContextMenu>
                </TextBlock.ContextMenu>
            </TextBlock>
    

    编辑:如果您使用 .net4.0,{x:Reference TestPropagateRoot} 也可能是一个选项

    【讨论】:

    • TextBlock 的DataContext 与ContextMenu 和MenuItem 最初相同。所以你的 Command 绑定没有意义。
    【解决方案2】:

    我的解决办法是:

    <HierarchicalDataTemplate x:Key="SchemTemplate">
                <TextBlock Text="{Binding path}" 
                           Tag="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:TestsPropagate}}}">
                    <TextBlock.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Открыть для просмотра"
                                      Command="{Binding Path=PlacementTarget.Tag.vclient.OpenInViewer, 
                                RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"
                                      CommandParameter="{Binding}" />                                    
                        </ContextMenu>
                    </TextBlock.ContextMenu>
                </TextBlock>
     </HierarchicalDataTemplate>
    

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 1970-01-01
      • 2016-01-17
      • 2016-07-14
      • 2014-07-20
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多