Wie verweist man mit der rechten Maustaste auf das Objekt im WPF-Kontextmenü? click event handler?

8

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:

%Vor%

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

verwendet %Vor%

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?

    
rem 09.01.2010, 08:37
quelle

7 Antworten

21

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

%Vor%

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

    
kenwarner 12.01.2010, 22:01
quelle
5

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:

Ссылка

    
Tbonechk27 12.08.2013 19:21
quelle
2

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.

    
Jason Williams 09.01.2010 08:48
quelle
2

Für RoutedEventArgs

  • RoutedEventArgs.source ist der Verweis auf das Objekt, das das Ereignis ausgelöst hat
  • RoutedEventArgs.originalSource ist die Berichtsquelle, die durch Pure-Hit-Tests ermittelt wird, bevor eine mögliche Quellenanpassung durch eine Elternklasse erfolgt.

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!

    
TFD 12.01.2010 21:10
quelle
1

Sollten Sie RoutedEventArgs.Source anstelle von sender nicht überprüfen?

    
Vijay Patel 12.01.2010 14:09
quelle
1

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:

%Vor%

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.

    
Ray Burns 12.01.2010 23:49
quelle
0

Das funktioniert für mich: -

XAML: -

%Vor%

Zum Hinzufügen von Menüpunkten: -

%Vor%

Und hier kommt der Hörer: -

%Vor%

Danke ...

    
Abhishek 30.07.2015 20:57
quelle

Tags und Links