Laden...

Checkbox "IsChecked" manuell wieder zurück nehmen nach fehlerhaften Validierung

Letzter Beitrag vor 27 Tagen 5 Posts 497 Views
Checkbox "IsChecked" manuell wieder zurück nehmen nach fehlerhaften Validierung

Hallo Forum-Gemeinde. Ich bin noch recht neu in der C# Welt unterwegs und habe daher vermutlich eher eine Anfängerfrage.

Ich habe auf dem UI einen Bereich „Area1“ welche aktiviert und deaktiviert werden kann. Ich realisiere das Ganze über eine einfache Checkbox.

Allerdings gibt es zwei Textboxen zu dieser Area, die beim Aktivieren nicht leer bzw. auch nicht Null sein dürfen.

Meine Idee war jetzt, wenn ich von der Checkbox das „IsChecked“ auswerte, wollte ich noch eine Validierung ausführen um sicher zu stellen, dass die TextBoxen gültig sind.

Allerdings habe ich ein Problem, dass ich nicht weiß, was ich tun soll, wenn die Validierung fehl schlägt. Denn in diesem Fall wurde die Checkbox bereits im UI „gehighlighted“ und ich kann es nicht mehr zurück nehmen so dass die Eingabe der Textboxen erneut vorgenommen werden muss. Ich habe versucht, das manuell wieder zurück zu nehmen aber dann renne ich „natürlich“ in einen Loop. Der Code ruft sich quasi wieder selbständig auf.

Was da passiert, kann ich irgendwie nachvollziehen.

Meine Frage ist jetzt, kann ich meine Idee überhaupt mit einer Checkbox lösen? Muss ich es vielleicht über einen anderen Weg lösen? Vielleicht über einen Button? Oder gibt es doch eine Möglichkeit über die Checkbox, ich weiß nur nicht wie man das macht?

Die CheckBox in der MainWindow.xaml:

<CheckBox x:Name="chBoxArea1Active" Content="Active" Margin="20,10,0,0" Height="17" IsChecked="{Binding Control.Bind_bChBoxArea1ActiveIsChecked}" IsEnabled="{Binding Control.Bind_bChBoxArea1ActiveIsEnabled}" />		

In der ViewModel Klasse Control:

// Checkbox button [Active] => "IsChecked" parameter
private bool bChBoxArea1ActivateIsChecked;
public bool Bind_bChBoxArea1ActiveIsChecked {
get { return bChBoxArea1ActivateIsChecked; }
set {
	SetProperty(ref bChBoxArea1ActivateIsChecked, value);
    // when [Active] on UI has been clicked, check the user dot settings
    if(Bind_bChBoxArea1EnableIsChecked) {
    	validateArea1DotSettings();
        } else {
        // otherwise dehighlight everything
        SetStateArea1(AreaStatus.AREA_STATE_WAIT_TO_ACTIVATE);
        }        
	}
}

private void validateArea1DotSettings() {
	if (!(validateUserDots(Bind_txBoxArea1FirstDotValue, Bind_txBoxArea1MaxDotsValue, "Area 1 settings"))) {
   	// uncheck again the checkBox because it hast just been checked on the UI
	Bind_bChBoxArea1ActiveIsChecked = false; // => DURCH DAS SETZEN AUF FALSE WIRD HIER ALLES WIEDER ERNEUT AUFGERUFEN
	// AN DIESER STELLE WÜRDE ICH GERNE DIE CHECKBOX WIEDER ZURÜCK NEHMEN,
	// SO DASS AM UI DIE TEXTBOXEN WIEDER NEU AUSGEFÜLLT WERDEN MÜSSEN
	return;
	}
	SetStateArea1(AreaStatus.AREA_STATE_ACTIVE);
}

Ich denke es ist nicht nötig, die Methode „SetStateArea1“ hier zu posten.

Also die Idee war, wenn die Validierung fehlschlägt, dann wollte ich das IsChecked wieder zurück nehmen, so dass die Checkbox auf dem UI wieder zurück genommen wird. Das manuelle zurücknehmen fürhrt dann aber dazu, dass das "set" für das Binding "Bind_bChBoxArea1ActiveIsChecked" wieder ausgelöst wird.
Ich hoffe ich habe es einigermaßen gut erklärt, was ich vor habe.

Vielleicht hat jemand eine Idee, wie man eine Validierung in einem CheckBox einbauen kann, so dass die Checkbox nur dann aktiv auf dem UI erscheint, wenn die Validierung auch OK war.

Danke schonmal für eure Hilfe.

Viele Grüße und einen schönes Wochenende (",)

Hallo Th69,

danke für Deinen Hinweis. Ich werde das mal ausprobieren.

Übrigens, ich sehe gerade, dass sich ein Fehlerteufel eingeschlichen hat.

In "set" stimmt die If-Abfrage nicht. Natürlich sollte die Abfrage auf "Bind_bChBoxArea1ActiveIsChecked" erfolgen, und nicht "Bind_bChBoxArea1EnableIsChecked"

Also:

// Checkbox button [Active] => "IsChecked" parameter
private bool bChBoxArea1ActivateIsChecked;
public bool Bind_bChBoxArea1ActiveIsChecked {
get { return bChBoxArea1ActivateIsChecked; }
set {
	SetProperty(ref bChBoxArea1ActivateIsChecked, value);
    // when [Active] on UI has been clicked, check the user dot settings
    if(Bind_bChBoxArea1ActiveIsChecked) {
    	validateArea1DotSettings();
        } else {
        // otherwise dehighlight everything
        SetStateArea1(AreaStatus.AREA_STATE_WAIT_TO_ACTIVATE);
        }
	}
}

Mit der Enable Checkbox soll generell alles aktiviert werden. Ist ein Schritt vor der Möglichkeit, alles zu aktivieren. Daher der Validierungs-Schritt dazwischen.
Sorry.
ich probiere das mal mit dem Flag.

Viele Grüße.

Hallo zusammen,

der Fehlerteufel hat mein Problem gelöst.

Es ist doch möglich, dass man manuell das "Bind_bChBoxArea1ActiveIsChecked" zurück nimmt. Meine Gedanke war doch richtig.

Sorry, dass ich nicht richtig geschaut habe. Durch das Schreiben hier, ist mir der Fehler dann doch selber aufgefallen.

Schönen Sonntag noch und viele Grüße 😉

Deine Namen sind aber auch m.E. ein bißchen zu komplex - als VM-Eigenschaft würde ich es einfach IsArea1Activebzw. IsArea1Checked nennen (weder das Bind noch der Control-Type ChBox sind hier sinnvoll).