我有点迷失绑定。 我在最后一小时尝试了很多东西,我无法列举所有这些东西。我在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,它有这些命令。
我该怎么办?
由于
答案 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>