我TreeView
有HierarchicalDataTemplate
。我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。调用命令工作正常,但我总是null
在CommandParameter
. 我发现了一些类似于我的问题,但我不明白解决方案。例如:
WPF 中 ContextMenu 中的 CommandParameters
无论如何它对我不起作用:(我做错了什么?
更新
这似乎有效,但都是一样的,我不明白为什么CommandParameter
不能使用TreeView.Name
.
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
例如,这样的示例可以正常工作
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding PackageTreeItemChangeCommand}" CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"/>
</i:EventTrigger>
什么鬼……
无论如何,我有TreeView
对象 in CommandParameter
,而不是TreeViewItem
。我可以SelectedItem
从那里得到TreeView
,但我怎样才能发送完全TreeViewItem
一样CommandParameter
?
到谢里登
问题是为什么这不起作用。
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"
这有效
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
为什么有时我可以直接使用 TreeView 控件名称,有时却不能。据我了解,物质是不同的 DataContextTreeView
控制,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>
这是最简单的方法,但是如果我在 ViewModel 中有 SelectedItem 属性,则将其绑定到 是没有意义的CommandParameter
,因为我已经在 ViewModel 中有它。
<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>