Wie auf der rechten Maustaste angeklickte Objekt im WPF-Kontext-Menü-item-click-event-handler?
In WPF-Anwendungen gibt es eine Grid
mit einer Reihe von Objekten (Sie sind abgeleitet von einem custom control). Ich möchte einige Aktionen auf jeden von Ihnen über Kontext-Menü:
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Name="EditStatusCm" Header="Change status" Click="EditStatusCm_Click"/>
</ContextMenu>
</Grid.ContextMenu>
Aber der event-handler-ich kann nicht wissen, welches der Objekte wurde mit der rechten Maustaste geklickt:
private void EditStatusCm_Click(object sender, RoutedEventArgs e)
{
MyCustControl SCurrent = new MyCustControl();
MenuItem menu = sender as MenuItem;
SCurrent = menu.DataContext as MyCustControl; //here I get a run-time error
SCurrent.Status = MyCustControl.Status.Sixth;
}
Auf, die auskommentierte Zeile Debugger sagt: der Objektverweis wurde nicht auf eine Instanz eines Objekts.
Bitte helfen, was ist falsch in meinem code?
Bearbeitet (Hinzugefügt):
Habe ich versucht, das gleiche zu tun, mit Befehl Ansatz:
Als ich erklärte, dass ein DataCommands
Klasse mit RoutedUICommand Requery
und dann Window.CommandBindings
<Window.CommandBindings>
<CommandBinding Command="MyNamespace:DataCommands.Requery" Executed="RequeryCommand_Executed"></CommandBinding>
</Window.CommandBindings>
XAML von MenuItem jetzt aussieht:
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Name="EditStatusCm" Header="Change status" Command="MyNamespace:DataCommands.Requery"/>
</ContextMenu>
</Grid.ContextMenu>
Und event-handler sieht so aus:
private void RequeryCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
IInputElement parent = (IInputElement)LogicalTreeHelper.GetParent((DependencyObject)sender);
MyCustControl SCurrent = new MyCustControl();
SCurrent = (MuCustControl)parent;
string str = SCurrent.Name.ToString();//here I get the same error
MessageBox.Show(str);
}
Aber debugger zeigt die gleiche run-time error: der Objektverweis wurde nicht auf eine Instanz eines Objekts.
Was fehlt in meinen beiden Ansätze?
Wie soll ich Verweis mit der rechten Maustaste geklickt Objekt in WPF-Kontext-Menü-item-click-event-handler?
- Ich habe versucht mit Befehl-Ansatz als WPF-ish, aber habe den gleichen Fehler. Ich bearbeitet meine Frage und fügte Schritte von meinem Befehl-Ansatz versuchen. Mein Verständnis von, wie man das angeklickte Objekt-Referenz ist etwas fehlt in beiden Fällen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: die CommandParameter
und verwenden Sie es in der Prozedur, um herauszufinden, welches Netz es ist
Update:
Wenn Sie möchten, den Menüpunkt-handler zu erhalten, um das Raster ist mit den Kindern, anstatt das Raster selbst, verwenden Sie diesen Ansatz,
Ersetzen Sie einfach die Textblöcke mit dem, was Ihre eigene Objekt-Typ ist. Dann im Ereignis-handler ersetzen
Grid g = cm.PlacementTarget as Grid
mitTextBlock t = cm.PlacementTarget as TextBlock
(oder was auch immer das benutzerdefinierte Objekt-Typ ist).CommandParameter
Bindung ist eigentlich nicht nötig, dae.Source
können stattdessen verwendet werden. Die einzige Voraussetzung für diese Arbeit ist, dass jedes element seine eigeneContextMenu
. ObwohlCommandParameter
ist deutlich weniger effizient als die Verwendunge.Source
wegen der Bindungen, man könnte problemlos argumentieren, dass es ist eleganter und daher lohnt sich der niedrigere Wirkungsgrad.Durch die Bindung der Daten-Kontext wie auch in der xaml:
Dann können Sie dies tun:
Den Daten-Kontext wird an dem Objekt, auf das geklickt wurde, um öffnen Sie die ContextMenu.
Ich habe es von einem codeproject-Artikel unter diesem link:
http://www.codeproject.com/Articles/162784/WPF-ContextMenu-Strikes-Again-DataContext-Not-Upda
menu = sender as MenuItem
wird null, wenn der Absender nicht einen MenuItem-oder eine abgeleitete Klasse davon. Anschließend versuchen Sie zu dereferenzieren, wird im Menü die Luft zu sprengen.Ist es wahrscheinlich, dass Ihr sender ist ein Menü oder Kontext-Menü oder ein ToolStripMenuItem oder einer anderen form der Menüpunkt, sondern als spezifisch wird ein MenuItem-Objekt. Verwenden Sie einen debugger-breakpoint zu stoppen Sie den code hier ein und untersuchen Sie die Absender-Objekt genau zu sehen, welche Klasse es ist.
Für RoutedEventArgs
So .Absender sollte die Antwort sein. Aber das hängt davon ab, wie die Einträge Hinzugefügt und gebunden
Sehen diese Antwort Sammlung und wählen Sie die Methode, die Arbeit wird für Sie die situation!
Sollten Sie nicht werden, die überprüfung
RoutedEventArgs.Source
stattsender
?Mussten Sie zwei unterschiedliche Probleme. Beide Probleme führten in die gleiche Ausnahme, waren aber sonst in keinem:
Erste problem
In Ihrem ersten Ansatz Ihr code war korrekt und lief gut bis auf das problem hier:
Den Namen "Status" ist sowohl eine statische member und als einer Instanz Mitglied. Ich denke, dass Sie durch Ausschneiden und einfügen den code falsch in deiner Frage.
Kann es auch notwendig sein, fügen Sie den folgenden nach
MenuItem menu = sender as MenuItem;
je nach Ihrer genauen situation:Zweite problem
In Ihre zweite Ansatz, den Sie verwendet, "Absender" anstelle von "e" haben.Quelle". Der folgende code funktioniert wie gewünscht:
Erwähnenswert
Hinweis: Es gibt überhaupt keinen Grund, zu binden
CommandParameter
für diese, wenn Sie der kommandierende Ansatz. Es ist deutlich langsamer und braucht mehr code.e.Source
wird immer das source-Objekt, so gibt es keine Notwendigkeit zu verwendenCommandParameter
, so dass stattdessen verwenden.Dies funktioniert für mich:-
XAML:-
Für das hinzufügen von Menüpunkten:-
- Und hier kommt der Zuhörer:-
Dank...
In meinem Fall war ich in der Lage zu verwenden: