我有树视图,有两个级别,在第二级我有模板与上下文菜单里面,我试图通过的TreeViewItem的ContextMenu属于作为一个CommandParameter,到目前为止没有成功,在我的应用程序中的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;
}
}
MenuItem
与TreeViewItem
不位于同一视觉树,这就是为什么FindAncestor不能旅行到窗口
你可以使用ContextMenu
的PlacementTarget
来获得TreeViewItem,它将自动继承窗口的DataContext。
你应该这样做:
<MenuItem Header="Test"
Command="{Binding PlacementTarget.DataContext.testCommand,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type ContextMenu}}}"/>