我有一个使用HierarchicalDataTemplate
的TreeView
。在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
绑定到菜单项。AddPackageCommand通常在ViewModell类中定义。调用命令可以正常工作,但是我总是在CommandParameter
中得到null
。我发现一些问题与我的类似,但我不明白解决方法。例如: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>
究竟是怎么回事...
而且,我在CommandParameter
中有一个TreeView
对象,而不是TreeViewItem
。我可以从TreeView
中获取SelectedItem
,但是如何将确切的TreeViewItem
作为CommandParameter
发送呢?
致Sheridan:
问题是为什么这样做不起作用。
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"
并且这个有效
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
为什么有时我可以直接使用TreeView控件的名称,而有时却不能?
据我所知,问题在于TreeView控件和ContextMenu具有不同的DataContext,因为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>