WPF treeview-contextmenu-Befehl parameter

Habe ich TreeView mit HierarchicalDataTemplate. Auf TreeView ich habe 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>

Wie Sie sehen können, ich Binde Command Menüpunkt. AddPackageCommand definiert, die im ViewModell-Klasse als gewöhnlich. Invoke-Befehl funktioniert, aber ich habe immer null im CommandParameter. Ich fand einige Fragen, ähnlich wie meine, aber ich verstehe nicht, Lösungen. Zum Beispiel:

CommandParameters im ContextMenu in WPF

Jedenfalls ist es bei mir nicht funktioniert 🙁 Was mache ich falsch?

Aktualisiert

Das scheint zu funktionieren, aber es ist alles das gleiche, ich verstehe nicht, warum CommandParameter funktioniert nicht mit TreeView.Name.

CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"

für examplle, wie eine Probe funktioniert

<i:EventTrigger EventName="SelectedItemChanged">
    <i:InvokeCommandAction Command="{Binding PackageTreeItemChangeCommand}" CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"/>
</i:EventTrigger>

Was solls...

Und ja, ich habe TreeView Objekt in CommandParameter, nicht TreeViewItem. Ich kann SelectedItem aus TreeView, aber wie kann ich senden genau TreeViewItem als CommandParameter?

zu Sheridan

Frage war WARUM das funktioniert nicht.

CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"

Funktioniert

CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"

WARUM manchmal kann ich direkt TreeView-Steuerelement name und manchmal kann ich nicht.
So wie ich das verstehe, die Sache ist anders DataContext von TreeView Kontrolle und ContextMenu weil ContextMenu hat seine eigene VisualTree und es ist nicht ein Teil von TreeView ViaualTree.

Leider, dass dieser Ansatz nicht funktioniert zu, ich habe null wieder. Ich TreeView.Tag, sicher.

<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>

Dies ist der einfachste Weg, aber wenn ich die SelectedItem-Eigenschaft im ViewModel es hat keinen Sinn, bindet es an CommandParameter, weil ich schon im 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>
das Zeug ist so unnötig kompliziert

InformationsquelleAutor monstr | 2013-10-02

Schreibe einen Kommentar