У меня есть 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
к пункту меню. AddPackageCommand, как обычно, определен в классе ViewModell. Команда Invoke работает нормально, но у меня всегда есть null
в CommandParameter
. Я нашел некоторые вопросы, похожие на мои, но я не понимаю решений. Например:
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
. Я могу получить SelectedItem
от TreeView
, но как я могу отправить точно 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 недвижимость в ViewModel не имеет никакого смысла, привязать его к 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>
этот материал настолько излишне сложный – hinst