如何将命令绑定到DataTemplate

时间:2015-05-07 14:35:34

标签: 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>

所以我有

UserControl --> ItemsControl --> ItemTemplate --> HyperLink --> TextBlock --> ContextMenu --> ContextMenuItem

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

我该怎么办?

由于

1 个答案:

答案 0 :(得分:7)

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>