Laden...

WPF Combobox manuell oder per Code umgeschalten?

Erstellt von m.grauber vor 11 Jahren Letzter Beitrag vor 10 Jahren 2.150 Views
Thema geschlossen
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren
WPF Combobox manuell oder per Code umgeschalten?

Hallo,

wie löst ihr es, wenn ihr im ComboBox.SelectionChanged wissen wollt, ob das SelectionChanged ausgelöst wurde,

-> indem der Benutzer einen anderen Wert ausgewählt hat oder ob
-> es ausgelöst wurde, weil sich die Daten im Code geändert haben.

Sowohl in sender als auch e habe ich kein Unterschied feststellen können.

Besten Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

X
9 Beiträge seit 2013
vor 11 Jahren

Ich mache solche Sachen meist über eine Klassenvariable. Zum Beispiel


bool IsManualFired;

private myMethod()
{
    IsManualFired = true;

    //hier der Code um die ComboBox zu manipulieren

    IsManualFired = false;
}

Dann halt in Deiner SelectionChanged-Methode prüfen, ob die Variable true oder false ergibt und darauf dann entsprechend reagieren.

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 11 Jahren

Hallo Xalir,

das ist bislang auch meine Lösung. Leider ist es nicht besonders elegant und wenn man später einmal mit mehreren Threads arbeitet, kann es sein, dass es zwischendurch umgeschalten wird.

Ich kenne es von anderen Programmiersprachen, dass es dort dafür sogar zwei unterschiedliche Events gibt.

Gibt es vielleicht noch Ideen? Hat das Microsoft vergessen?

Besten Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

X
9 Beiträge seit 2013
vor 11 Jahren

Mir ist keine andere Methode bekannt, die es besser löst. Und es gibt auch keine unterschiedlichen Events dafür. Beim Multithreading könnte dies helfen


private void MethodWhichFiresEvents (Action myAction)
{
    IsManualFired = true;

    myAction();

    IsManualFired = false;
}

private void DoStuff()
{
    MethodWhichFiresEvents(() =>
    {
        cmbList.Children.Add(new ComboBoxItem());
    });
}
5.658 Beiträge seit 2006
vor 11 Jahren

Hi m.grauber,

Sowohl in sender als auch e habe ich kein Unterschied feststellen können.

Es gibt keinen Unterschied, und ich kann mir ehrlich gesagt auch keinen Anwendungsfall vorstellen, wo man die Unterscheidung benötigen würde. Was genau hast du denn vor, daß du das unterscheiden mußt? Evtl. kann man etwas am Programmaufbau ändern, damit man sich die Überprüfung sparen kann.

Christian

Weeks of programming can save you hours of planning

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 10 Jahren

Hallo Christian!

Inzwischen bin ich wieder da.

Das gleiche Problem habe ich jetzt mit einer Checkbox. Auch hier muss ich unterscheiden:

  1. Zweck:

Sobald die Checkbox gecheckt ist, soll IMMER ein bestimmter Text ausgegeben werden und verschiedenes am Layout geändert werden.

Das soll immer passieren (also wenn der Benutzer die Checkbox anklickt und auch wenn beim Laden der DataContext gesetzt wird)

  1. Zweck:

Klickt der User aktiv die Checkbox an, um sie umzustellen, soll noch eine zusätzliche Abfrage z. B. per MessageBox erfolgen. - Diese soll natürlich beim Laden nicht geöffnet werden, da ja nur der letzte Zustand wiederhergestellt werden soll und der User ja bereits diese Messagebox ggfls. angeklickt hatte.

Somit muss ich unterscheiden können, ob der User geklickt hat oder ob sich nur der DataContext geändert hat.

Wenn ich nun sehr viele Checkboxen und Comboboxen habe, muss es doch möglich sein, diese Unterscheidung zu treffen, ohne dass ich noch für jede Combobox und Checkbox ein manuelles IsManualFired einbaue?

(Irgendwie müsste man das ja im "sender" oder "e" sehen, ob es der DataContext ist oder ein Mausklick oder Return-Taste etc. - Ich habe aber alles verglichen - ohne den Unterschied zu finden.)

Danke

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 10 Jahren

Hallo!

Hat irgend jemand noch eine Idee? X(

Das muss man doch herausfinden können!?

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

V
8 Beiträge seit 2008
vor 10 Jahren

Hi,

willst du das unbedingt mit Eventhandlern lösen?
So wie ich das verstehe, bewegst du dich im Codebehind (korrigier mich, falls ich falsch liege 😉 ).

Hast du dich schonmal mit MVVM und Binding befasst?

Ich denk damit kannst du das besser lösen.

Der Text, der ausgegeben werden soll, wenn die Checkbox "checked" ist, steht in einem Label, oder wo soll der angezeigt werden?
Weil das kannst auch mit Binding lösen.

Gruß

Florian

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 10 Jahren

Hallo Florian,

vielen Dank.

Sagen wir wir haben die Tabelle1 und darin die Felder Checkwert1 bis Checkwert 10. Der aktuelle Datensatz ist bereits per Binding gebunden.

PropertyChanged ist auch bereits für den Datensatz abonniert. Es wirkt sich aber derzeit auf den gesamten Datensatz aus.

Im Fenster ist es notwendig, das Checkwert1 an mehreren verschiedenen Stellen geändert wird (abhängig von anderen Parametern). Aber nur wenn Checkwert1 durch manuelles Anklicken der Checkbox1 geändert wird, soll eine Messagebox geöffnet werden und weiterer Code abgearbeitet werden. Ich kann mich also nicht rein auf das Checkwert1-PropertyChange stützen. Daher am besten der Ansatz direkt über das Checkbox-Control.

Das muss doch möglich sein? Ich verstehe nicht, wieso Microsoft das so kompliziert gemacht hat?

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

D
31 Beiträge seit 2010
vor 10 Jahren

Und wenn du einfach die Messagebox in eine eigene Methode packst, die boolean zurückgibt?
Dann musst du nur in dieser Methode auf IsManualFired prüfen (also 1 mal, evtl. musst du halt noch den TextBox.Text mitgeben) und kannst, wenn du es aus dem Code änderst einfach true zurückgeben.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo m.grauber,

so ein langer Thread, für etwas, was in der FAQ bereits abschließend beantwortet wurde, siehe [FAQ] Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung.

Das Argument Multithreading greift nicht, denn das GUI ist per se Single-Threaded. Den Zugriff auf die ComboBox muss man sowieso im GUI-Thread ausführen (siehe [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)) und das das Umsetzen der bool-Variable macht man sowieso direkt vor und nach dem Zugriff, also auch im GUI-Thread. Es gibt in dieser Hinsicht also überhaupt kein Problem.

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.

herbivore

Thema geschlossen