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>
InformationsquelleAutor monstr | 2013-10-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie zeigte uns, dass Sie schon eine Antwort haben... warum in aller Welt hast du post noch eine andere Frage auf das gleiche Thema, anstatt einfach nach dem Beispiel in der Antwort? Es funktioniert nicht für Sie, weil Sie nicht Kopie der Antwort richtig.
In deinem Beispiel-post-Antwort, die
Tag
- Eigenschaft auf denTreeView
Kontrolle, dass das Menü angewendet wird, auf, aber haben Sie nicht getan.Deine nächste problem ist, dass du ignoriert diese
Tag
Eigentum wieder in dieCommandParameter
... irgendwie haben Sie sich verändert, dies von der richtigen Antwort:diese in Ihre Frage:
Alles, was Sie tun musste, um das kopieren und einfügen. Alle die gleichen, müssen Sie möglicherweise sogar mehr Glück, dies zu tun:
Blick auf die
TreeView.Tag
Eigentum... dies ist eineDataContext
, was bedeutet, dass alles, was festgelegt ist als dasDataContext
desTreeView
ist jetzt in derTag
- Eigenschaft Objekt.Weiter Blick auf die
ContextMenu.DataContext
Eigentum... ist dieTag
Eigenschaft desPlacementTarget
, ist die Kontrolle, dass dieContextMenu
angewendet wird, oder in diesem Fall, dieTreeview
.Wenn Sie nicht gearbeitet habe, es sich noch aus, das bedeutet, dass die
DataContext
desContextMenu
ist nun eingestellt, um das gleiche Objekt wie dieDataContext
desTreeView
. Wenn dieses nicht ist, was Sie wollen, weil IhreCommand
auf ein anderes Objekt, dann ändern Sie einfach dieBinding
Weg in dieTag
Eigenschaft zu zeigen, wo das Objekt, das hatten dieCommand
ist.Die Letzte Sache, die Sie tun können, um diese einfacher ist es, eine Eigenschaft hinzuzufügen, um Ihre Ansicht Modell - /code-hinter, der an der
TreeView.SelectedItem
Eigenschaft:Dann können Sie einfach beziehen sich auf diese Eigenschaft für Ihre
CommandParameter
:Diesem letzten Teil des Kurses wird davon ausgegangen, dass Sie Ihre Ansicht Modell - /code-behind als
Tag
Eigenschaft desTreeView
. Wenn Sie immer noch nicht verstehen, nehmen Sie einen Blick auf die Kontext-Menüs in WPF Seite auf WPF Tutorial.NET.UPDATE >>>
Ich einfach nicht verstehen, warum Sie stellte diese Frage. Zuerst sagte Sie, dass Sie etwas nicht tun könnte, aber dann bot uns einen link zu einer gültigen Lösung in einem anderen Beitrag. Nach dem Versuch, Ihnen zu helfen, Sie dann sagen, dass es funktioniert hat, aber Sie weiß nicht warum... aber dann wird Sie richtig beantwortet Ihre eigene Frage wieder:
Als Sie sagte, die
ContextMenu
hat seine eigene visuelle Struktur. Dies bedeutet, dass es nicht bewusst steuert, benannt oder anderweitig, in einem anderen visuellen Struktur. Allerdings, wenn dieContextMenu.DataContext
ist mit einem Gegenstand wie mit anzeigen, dann ist es kann bewusst sein, Steuerelemente in ein anderes visual-tree (genauer, die visuelle Struktur der Steuerelemente in der Ansicht).Dieses ganze Thema scheint down zu sein, um fehlende Kenntnisse über
Binding
im Allgemeinen und derBinding.Path
syntax genauer. Schauen Sie sich bitte den folgenden Artikel auf der MSDN-Website für weitere Hilfe zu diesem Thema:Die Bindung.Path-Eigenschaft
Eigenschaft Der Pfad-Syntax
RelativeSource MarkupExtension
So viele Menschen versuchen zu laufen, mit WPF, bevor Sie gehen können.
---Nach dem Versuch, Ihnen zu helfen, Sie dann sagen, dass es funktioniert hat, aber Sie weiß nicht, warum. Keine sage ich IHR Ansatz funktioniert nicht. (Ich kopierte code). Ansatz mit binding DataContext von TreeView.Tag und so weiter. Ansatz wurde vorgeschlagen, als Antwort in den link, den ich gepostet. Auch wenn ich ContextMenu.DataContext-Eigenschaft als TreeView.Tag auch, dann habe ich null in
CommandParameter
🙁 trotzdem thx.Denn Sie konnte nicht, mein Beispiel funktioniert nicht nicht bedeutet, dass es nicht funktioniert. Es bedeutet einfach, dass Sie es nicht verstehen. Wenn Sie sich die Zeit genommen zu lernen
Binding
- syntax, wie ich vorgeschlagen haben, dann werden Sie vielleicht verstehen.Habe ich gesagt, dass Sie dumm waren? Nein, habe ich nicht. Ich sagte einfach, dass Sie verstanden es nicht, das ist eindeutig wahr. Können Sie nicht sehen, wie schwer ich habe versucht, Ihnen zu helfen, und wie viel ich schrieb? Ich bin nicht einmal zu Antworten auf Ihre letzten Kommentare, weil Sie wirklich dumm sind.
InformationsquelleAutor Sheridan