我有TreeView
和HierarchicalDataTemplate
。在TreeView
我ContextMenu
WPF treeview contextmenu命令参数
<TreeView Name="_packageTreeView" ItemsSource="{Binding PackageExtendedList}" Behaviors:TreeViewInPlaceEditBehavior.IsEditable="True">
<TreeView.ContextMenu>
<ContextMenu StaysOpen="true">
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</TreeView.ContextMenu>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Childs}">bla bla bla</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
正如你所看到的,我结合Command
菜单项目。通常在ViewModell类中定义的AddPackageCommand。 Invoke命令可以正常工作,但我总是在CommandParameter
中有null
。我发现了一些类似于我的问题,但我不明白解决方案。例如:?
CommandParameters in ContextMenu in WPF
反正它不为我工作:(我在做什么错
更新
这似乎是工作,但它是完全一样的,我不明白为什么CommandParameter
不TreeView.Name
工作。
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
为examplle,这样的样本工作正常
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding PackageTreeItemChangeCommand}" CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"/>
</i:EventTrigger>
什么是地狱......
反正我有TreeView
对象CommandParameter
,不TreeViewItem
。我可以从TreeView
得到SelectedItem
,但是我怎样才能发送TreeViewItem
作为CommandParameter
?
到谢里登
问题是为什么这不起作用。
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"
而且这个工程
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
为什么有时我可以直接使用TreeView控件的名字,有时我不能。 据我所知,物质是不同的DataContext的TreeView
控制和ContextMenu
,因为ContextMenu
有它自己的VisualTree,它不是TreeView
ViaualTree
的一部分。
不幸的是,那种方法也不能工作了,我又有null
。我确定设置了TreeView.Tag。
<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={
RelativeSource Self}}" StaysOpen="true">
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
这是最简单的方法,但如果我有SelectedItem属性在视图模型它没有道理将其绑定到CommandParameter
,因为我已经拥有它的视图模型。
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
这东西是如此不必要的复杂 – hinst