如何将命令绑定到DataTemplate中的ContextMenu

cdi*_*die 3 c# wpf binding

我有点迷失绑定.我在最后一小时尝试了很多东西,我无法列举所有这些东西.我在DataTemplate中遇到了contextMenu的问题.

解释:我有一个UserControl.它的dataContext本身就是.在这里UserControl,我有一个ItemsControl来表示超链接列表.我ItemsControl itemsSource受约束(它由对象元素组成).我重新定义了ItemsControl.ItemTemplate.在里面,我创建了一个HyperLink,TextBlock作为孩子使其工作,并在此TextBlock,我ContextMenu通过执行以下操作设置.

<TextBlock.ContextMenu>
  <ContextMenu DataContext="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}">
    <MenuItem Header="Enregistrer la pièce jointe" Foreground="Black">
      <MenuItem Header="Dans le dossier patient" Command="{Binding DataContext.SaveAttachmentIntPatientFolderCommand, RelativeSource={RelativeSource AncestorType=UserControl}}" CommandParameter="{Binding FilePath}" Foreground="Black" />
      <MenuItem Header="Enregistrer sous ..." Command="{Binding DataContext.SaveAttachmentAsCommand}" CommandParameter="{Binding FilePath}" Foreground="Black" />
    </MenuItem>
  </ContextMenu>
</TextBlock.ContextMenu>
Run Code Online (Sandbox Code Playgroud)

所以我有

UserControl --> ItemsControl --> ItemTemplate --> HyperLink --> TextBlock --> ContextMenu --> ContextMenuItem
Run Code Online (Sandbox Code Playgroud)

我知道我的第一个相对来源不起作用,我有一个绑定错误.我想要的是绑定我的UserContorl datacontext,它具有这些命令.

我该怎么办?

谢谢

Ayy*_*ian 9

ContextMenu采用ItemsControl的DataContext,因此无法直接访问ViewModel.它也不是VisualTree的一部分,所以你不能做RelativeSource绑定.所以我们需要通过TextBlock的Tag属性获取UserControl的DataContext,然后绑定到ContextMenu.您可以参考以下代码.

 <TextBlock Text="{Binding }" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=UserControl}}">
                            <TextBlock.ContextMenu>
                                <ContextMenu >
                                    <MenuItem Header="Enregistrer la pièce jointe" Foreground="Black">
                                        <MenuItem Header="Dans le dossier patient" Command="{Binding Path=PlacementTarget.Tag.SaveAttachmentIntPatientFolderCommand,
                                            RelativeSource={RelativeSource AncestorType=ContextMenu}}"                                                  
                                                  Foreground="Black" />
                                        <MenuItem Header="Enregistrer sous ..." Command="{Binding Path=PlacementTarget.Tag.SaveAttachmentAsCommand,
                                            RelativeSource={RelativeSource AncestorType=ContextMenu}}"  
                                                   Foreground="Black" />
                                    </MenuItem>
                                </ContextMenu>
                            </TextBlock.ContextMenu>
                        </TextBlock>     
Run Code Online (Sandbox Code Playgroud)