如何将命令绑定到 DataTemplate 中的 ContextMenu [英] How to bind command into ContextMenu in DataTemplate
问题描述
我对绑定有点迷茫.在过去的一个小时里我尝试了很多东西,我无法一一列举.我在 DataTemplate 中的 contextMenu 有问题.
I'm a little bit lost with bindings. I tried so many things in the last hour, I cannot enumerate all of them. I have an issue with a contextMenu inside a DataTemplate.
解释一下:我有一个UserControl
.它的 dataContext 是它本身.在这个 UserControl
中,我有一个 ItemsControl 来表示超链接列表.我的 ItemsControl
itemsSource
已绑定(它由对象元素组成).我重新定义了 ItemsControl.ItemTemplate
.在里面,我创建了一个超链接,以 TextBlock
作为子项使其工作,并在这个 TextBlock
上,我通过执行以下操作设置了一个 ContextMenu
.
To explain: I have a UserControl
. Its dataContext is itself. Inside this UserControl
, I have an ItemsControl to represent a list of Hyperlink. My ItemsControl
itemsSource
is bound (it is composed of objects elements).
I redefined ItemsControl.ItemTemplate
. Inside, I create a HyperLink, with TextBlock
as child to make it work, and on this TextBlock
, I set a ContextMenu
by doing the following.
<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 数据上下文,其中包含这些命令.
I know that my first relative source doesn't work, I have a binding error. What I want is to bind on my UserContorl datacontext, which have these commands.
我该如何继续?
谢谢
推荐答案
ContextMenu 接受 ItemsControl 的 DataContext,因此它不能直接访问 ViewModel.此外,它不是 VisualTree 的一部分,因此您不能进行 RelativeSource 绑定.所以我们需要通过TextBlock的Tag属性来获取UserControl的DataContext,然后绑定到ContextMenu上.你参考下面的代码.
ContextMenu takes the DataContext of the ItemsControl and so it cannot access the ViewModel directly. Also It is not part of the VisualTree and so you cannot do RelativeSource binding. So We need to get the DataContext of the UserControl through TextBlock's Tag property and then bind to ContextMenu. You refer the below code.
<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>
这篇关于如何将命令绑定到 DataTemplate 中的 ContextMenu的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!