Laden...

Beim Öffnen von ContextItem das geklickte Item feststellen

Erstellt von Jacyrio vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.538 Views
J
Jacyrio Themenstarter:in
197 Beiträge seit 2006
vor 7 Jahren
Beim Öffnen von ContextItem das geklickte Item feststellen

Hey,

ich habe eine Frage. Ich habe ein Canvas auf dem verschiedene Objekte (Rectangle, Linie, Polys usw.) gezeichnet sind. Gezeichnet werden die Items anhand einer ObservableCollection<DrawItem>.

Nun möchte ich gerne ein Contextmenu erstellen.. und wenn ich auf ein Rectangle klicke "Konfigurieren" auswählen können.

Das Contextmenu habe ich bereits erstellt (im Canvas). Problem ist für mich das Click-Event (bzw. Command). Ich müsste in dem Event wissen welches DrawItem das Event ausgelöst hat.

Ein Parameter "SelectedItem" welches ich verwenden könnte gibt es nicht und bei den MVVM-Commands gibts es auch nicht das "RoutedEventArgs".. zumindestens kenne ich es noch nicht.

Hätte vielleicht einer einen Tipp von euch wie ich an das Objekt komme welches das Event auslöst?

Vielen Dank 😃

D
985 Beiträge seit 2014
vor 7 Jahren

So einen Event kann es gar nicht geben, da du ja auf einen Canvas malst und dann ist es einfach nur noch ein Einheitsbrei.

Du musst bei einem Klick auf den Canvas durch deine Liste gehen und schauen, welches deiner Objekte denn damit wohl gemeint gewesen sein könnte.

J
Jacyrio Themenstarter:in
197 Beiträge seit 2006
vor 7 Jahren

Das Canvas erkennt doch auch wenn ich rechte Maustaste (Contextmenu geht nicht auf) in einen leeren (nicht bemalten) Bereich mache.. oder rechte Maustaste auf einem Rectangle (CM geht auf) mache. Eigentlich bräuchte ich doch jetzt nur noch den Sender an die Methode (irgendwie) übergeben?

Wenn ich mit dem Code-Behind - und nicht mit einem ViewModel - arbeite, bekomme ich den Sender doch auch mit e.Source bzw e.OrginalSource. Bei einem ViewModel-Command geht das dann leider nicht? 😕


Okay ich glaube ich habe nun verstanden wieso ich nicht "direkt" an das DrawItem-Objekt komme. Dann muss ich die Frage aber anders stellen:

Was wäre eine Möglichkeit mit MVVM an das DrawItem zu kommen? Selbst wenn ich - wie vorgeschlagen - die Liste der Items durchlaufen würde (was übrings sehr viele sein können zukünftig).. ich habe nichts zum "Vergleichen" um herauszufinden, welches DrawItem gemeint sein könnte.

Hätte hier jemand eine Idee oder einen "Denkanstoß" wie ich das machen könnte? Bin ich vielleicht bei meinem Vorhaben mit einem Canvas falsch und es gibt was ganz anderes?

Vielen Dank schon mal 😃

J
Jacyrio Themenstarter:in
197 Beiträge seit 2006
vor 7 Jahren

Hey..

ich habe mir die Lösung nun etwas zusammen gemogelt, habe hänge nun woanders bzw. kann mir das nicht so ganz erklären. Also erstmal was ich gemacht habe:

Wenn ich auf ein Rectangle die mit Rechts klicke führe ich ein Command im ItemViewModel (Rectangle) aus und gebe das geklickte Item per Messenger an das DrawViewModel (dort gibt es eine OC mit allen Items) weiter (SelectedItem).

Und wenn ich das MenuItem "Einstellungen" im Contextmenü auf dem Canvas auswähle öffne ich das Einstellungs-Window und hänge das selektierte Item an den DataContext.


        private void ExecuteOnClickCMConfig()
        {
            ItemView vw = new ItemView();
            vw.DataContext = SelectedItem;
            vw.ShowDialog();
        }

Mir ist bewusst das das nicht MVVM-Konform ist.. aber ich habe nach tagelangen suchen keine andere Lösung gefunden und da das DrawView und ItemView unmittelbar IMMER zusammen gehört glaube ich, dass es so auch nicht schlimm ist.

Nun mein nächstes "Problem":
Das Konfig-Fenster ist nun offen. In diesem gibt es z. B. die Properties Width, Height, Background-Color, Left und Top. Ändere ich einen dieser Werte im Konfig-Window wird unmittebar das Rectangle im Canvas angepasst. War so im ersten Moment gar nicht geplant, aber eigentlich ja eine tolle Sache.

Gehe ich nun mit dem Mauszeiger auf das Kästchen und schiebe es per Drag und Drop hin und her werden die Koordinaten auch direkt an das Config-Fenster weiter gegeben sobald ich das Rectangle wieder los lasse.

Ab diesem Zeitpunkt verhält sich aber mein Config-Window aufeinmal anders: Ändere ich Width, Heigh, Background-Color passt sich das Rectangle wie oben noch an. Ändere ich nun aber Left und Top verschiebt sich das Rectangle nicht mehr automatisch...

Wieso ist das Verhalten so? Wies ist die "Verbindung" nur bei diesen zwei Werten aufeinmal unterbrochen, wenn ich das Rectangle auf dem Canvas bewege und nicht mehr übers Config-Formular? Hat da einer auf Anhieb eine Erklärung für?

Ich hoffe ich habs vernünftig erklären können 😃 Ansonsten gern noch mal nachfragen..

5.658 Beiträge seit 2006
vor 7 Jahren

Hi Jacyrio,

"tagelanges Suchen" hört sich für mich immer danach an, daß man sich in etwas verrannt hat, für das es keine Lösung gibt.

Wenn ich deine Beschreibung richtig verstehe, versuchst du, eine Art Zeichenprogramm zu schreiben. Dafür gibt es doch bereits Beispiele im Internet, wo auch MVVM angewandt wird. Außerdem findest du auch genügend Beispiele, wo ContextMenus bzw. deren Commands an die selektierten Elemente gebunden werden können, alles ohne Code-Behind.

Weeks of programming can save you hours of planning

M
177 Beiträge seit 2009
vor 7 Jahren

Ich hätte es über diesen Weg probiert.

http://stackoverflow.com/questions/362670/how-can-i-get-an-listview-item-from-the-x-y-position

Sollte sich eigentlich auch für einen Canvas anwendbar sein.

Um das ganze MVVM kompatibel zu Machen kannst du dafür eine Attached Property + DelegateCommand verwenden der dann ausgelöst wird.