我有两个级别的树视图,在第二级我有模板,里面有一个上下文菜单,我试图传递ContextMenu属于CommandParameter的TreeViewItem,到目前为止没有成功,在我的应用程序中,TreeviewItem有一个HierarchicalDataTemplate,但这里是我的XAML的简化示例:
<Grid
Background="Transparent">
<TreeView>
<TreeViewItem Header="blabla1"/>
<TreeViewItem Header="blabla2">
<TreeViewItem Header="innerblalbla">
<TreeViewItem.ContextMenu>
<ContextMenu>
<MenuItem Header="Test"
Command="{Binding PlacementTarget.DataContext.testCommand,
RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ContextMenuu}}}"
CommandParameter=??????/>
</ContextMenu>
</TreeViewItem.ContextMenu>
</TreeViewItem>
</TreeViewItem>
</TreeView>
</Grid>
和我的viewModel(DataContext在代码后面设置):
class myViewModel : INotifyPropertyChanged
{
public myViewModel()
{
testCommand = new DelegateCommand(test);
}
public DelegateCommand testCommand { get; set; }
private void test()
{
var x = 1;
}
}
答案 0 :(得分:2)
MenuItem
与TreeViewItem
不在同一个视觉树中,这就是为什么FindAncestor无法前往Window。
您可以使用PlacementTarget
ContextMenu
来获取TreeViewItem,它将自动继承窗口的DataContext。
您就是这样做的:
<MenuItem Header="Test"
Command="{Binding PlacementTarget.DataContext.testCommand,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ContextMenu}}}"/>