In der WPF-Anwendung gibt es Grid
mit einer Anzahl von Objekten (sie stammen von einem benutzerdefinierten Steuerelement). Ich möchte einige Aktionen für jedes von ihnen über das Kontextmenü ausführen:
Aber im Event-Handler kann ich nicht herausfinden, auf welches der Objekte mit der rechten Maustaste geklickt wurde:
%Vor%In dieser Kommentarzeile sagt Debugger: Objektverweis nicht auf eine Instanz eines Objekts gesetzt.
Bitte helfen Sie, was ist falsch in meinem Code?
Bearbeitet (hinzugefügt):
Ich habe versucht, dasselbe zu tun, indem ich den Befehl Ansatz verwende:
Ich habe eine DataCommands
Klasse mit RoutedUICommand Requery
deklariert und dann Window.CommandBindings
XAML von MenuItem sieht jetzt wie folgt aus:
%Vor%Und der Event-Handler sieht so aus:
%Vor%Aber Debugger zeigt den gleichen Laufzeitfehler: Objektverweis nicht auf eine Instanz eines Objekts festgelegt.
Was fehlt in meinen beiden Ansätzen?
Wie sollte ich mit der rechten Maustaste auf das Objekt im WPF-Kontextmenü klicken, klicken Sie auf Event-Handler?
Beachten Sie das CommandParameter
%Vor%und verwenden Sie es im Handler, um herauszufinden, welches Grid es ist
%Vor% Aktualisierung:
Wenn Sie möchten, dass der menuitem-Handler anstelle des Grids selbst die Grid-Child-Elemente aufruft, verwenden Sie diese Methode
Ersetzen Sie einfach die TextBlocks durch den benutzerdefinierten Objekttyp. Ersetzen Sie dann im Ereignishandler Grid g = cm.PlacementTarget as Grid
durch TextBlock t = cm.PlacementTarget as TextBlock
(oder was auch immer Ihr benutzerdefinierter Objekttyp ist).
Indem Sie den Datenkontext wie im xaml binden:
%Vor%Sie können dies tun:
%Vor%Der Datenkontext wird an das Objekt gebunden, auf das geklickt wurde, um das ContextMenu zu öffnen.
Ich habe es von einem Codeprojekt Artikel an diesem Link:
menu = sender as MenuItem
ist null, wenn der Absender kein MenuItem oder eine davon abgeleitete Klasse ist. Anschließend wird versucht, das Menü zu dereferenzieren.
Es ist wahrscheinlich, dass Ihr Absender ein Menu oder ContextMenu oder ein ToolStripMenuItem oder eine andere Form eines Menüelements ist, und nicht speziell ein MenuItem-Objekt. Verwenden Sie einen Debugger-Haltepunkt, um den Code hier zu stoppen, und untersuchen Sie das Absenderobjekt, um genau zu sehen, um welche Klasse es sich handelt.
Für RoutedEventArgs
Also .Sender sollte die Antwort sein. Dies hängt jedoch davon ab, wie die Menüelemente hinzugefügt und gebunden werden.
Sehen Sie sich diese Antwortsammlung an und wählen Sie die Methode, die für Sie Situation funktioniert!
Sollten Sie RoutedEventArgs.Source
anstelle von sender
nicht überprüfen?
Sie hatten zwei verschiedene Probleme. Beide Probleme führten zur gleichen Ausnahme, waren aber ansonsten unabhängig:
Erstes Problem
Bei Ihrer ersten Annäherung war Ihr Code korrekt und lief gut bis auf das Problem hier:
%Vor%Der Name "Status" wird sowohl als statisches Mitglied als auch als Instanzmitglied verwendet. Ich glaube, Sie haben den Code falsch ausgeschnitten und in Ihre Frage eingefügt.
Es kann auch notwendig sein, abhängig von Ihrer exakten Situation folgendes nach MenuItem menu = sender as MenuItem;
hinzuzufügen:
Zweites Problem
In Ihrem zweiten Ansatz haben Sie "Absender" anstelle von "e.Quelle" verwendet. Der folgende Code funktioniert wie gewünscht:
%Vor%Schlussnote
Hinweis: Es besteht überhaupt kein Grund, CommandParameter
zu binden, wenn Sie den Commanding-Ansatz verwenden. Es ist deutlich langsamer und benötigt mehr Code. e.Source
wird immer das Quellobjekt sein, so dass Sie CommandParameter
nicht verwenden müssen, verwenden Sie stattdessen stattdessen.
Tags und Links wpf c# event-handling contextmenu