如何将命令绑定到 DataTemplate 中的 ContextMenu
How to bind command into ContextMenu in DataTemplate
我对绑定有点迷茫。
在过去的一个小时里我尝试了很多东西,我无法一一列举。我对 DataTemplate 中的 contextMenu 有疑问。
解释一下:我有一个UserControl
。它的 dataContext 就是它自己。在这个 UserControl
中,我有一个 ItemsControl 来表示超链接列表。我的 ItemsControl
itemsSource
是绑定的(它由 objects 元素组成)。
我重新定义了ItemsControl.ItemTemplate
。在内部,我创建了一个超链接,以 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 数据上下文,它有这些命令。
我该如何继续?
谢谢
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>
我对绑定有点迷茫。 在过去的一个小时里我尝试了很多东西,我无法一一列举。我对 DataTemplate 中的 contextMenu 有疑问。
解释一下:我有一个UserControl
。它的 dataContext 就是它自己。在这个 UserControl
中,我有一个 ItemsControl 来表示超链接列表。我的 ItemsControl
itemsSource
是绑定的(它由 objects 元素组成)。
我重新定义了ItemsControl.ItemTemplate
。在内部,我创建了一个超链接,以 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 数据上下文,它有这些命令。
我该如何继续?
谢谢
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>