我正在尝试将MenuItem的命令绑定到UserControl.DataContext
中包含的命令。我发现了几个类似的问题,但根据它们的解决方案对我没有意义:
<UserControl ...>
<UserControl.Resources>
<DataTemplate x:Key="TileItemStye">
<Grid Width="100" Height="100">
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Header="Remove"
Command="{Binding DataContext.RemoveItem,
RelativeSource={RelativeSource FindAncestor,
AncestorType=UserControl}}">
</MenuItem>
</ContextMenu>
</Grid.ContextMenu>
</Grid>
</DataTemplate>
</UserControl.Resources>
<Grid>
<ListView ItemsSource="{Binding Path=Files}"
ItemTemplate="{DynamicResource TileItemStye}" >
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
</Grid>
UserControl的DataContext是带有ICommand
RemoveItem和ObservableCollection<FileViewModel>
文件的ViewModel。
答案 0 :(得分:13)
如果您使用的是.NET 4,确实有一个更优雅的解决方案:
<UserControl Name="uc" ...>
<!-- ... -->
<MenuItem Header="Remove"
Command="{Binding DataContext.RemoveItem,
Source={x:Reference uc}}"/>
(这要求模板保留在参考资料中,否则会出现周期性依赖性错误)
答案 1 :(得分:4)
菜单不会与您的控件在同一个Visual Tree中绘制,这就是RelativeSource绑定不起作用的原因
您需要绑定到PlacementTarget
的{{1}}才能访问主要的Visual Tree
ContextMenu