Das folgende scheint ein relativ allgemeines Muster zu sein (für mich, nicht für die Gemeinschaft insgesamt), eine String-Variable an den Inhalt einer TextBox zu binden.Wie kann ich eine unendliche Rekursion verhindern, wenn ich Ereignisse mit Elementen an Felder binden soll?
class MyBackEndClass
{
public event EventHandler DataChanged;
string _Data;
public string Data
{
get { return _Data; }
set
{
_Data = value;
//Fire the DataChanged event
}
}
}
class SomeForm : // Form stuff
{
MyBackEndClass mbe;
TextBox someTextBox;
SomeForm()
{
someTextBox.TextChanged += HandleTextBox();
mbe.DataChanged += HandleData();
}
void HandleTextBox(Object sender, EventArgs e)
{
mbe.Data = ((TextBox)sender).Text;
}
void HandleData(Object sender, EventArgs e)
{
someTextBox.Text = ((MyBackEndClass) sender).Data;
}
}
Das Problem ist, dass die TextBox Ändern der Änderungen der Datenwert im Backend ausgelöst, die das Textfeld verursacht, usw. zu ändern, die für immer läuft.
Gibt es ein besseres Design-Muster (außer der Rückgriff auf eine böse boolesche Flagge), die diesen Fall richtig behandelt?
EDIT: Um klar zu sein, in der realen Design wird die Backend-Klasse verwendet, um Änderungen zwischen mehreren Formularen zu synchronisieren. Daher kann ich die SomeTextBox.Text-Eigenschaft nicht direkt verwenden.
billy3
Ich bin verwirrt. Wenn Sie TextBox.Text zweimal hintereinander auf denselben Wert setzen, wird nur ein ** TextChanged-Ereignis ausgelöst. – ParmesanCodice
@ParmesanCodice: Nein. Jedes Mal, wenn jemand den Inhalt der Textbox ändert - auch wenn der Inhalt der darin enthaltenen Zeichenfolge sich nicht ändert - wird das TextChanged-Ereignis ausgelöst. –
merkwürdig Ich führe gerade dein Programm, sehe dieses Verhalten nicht. – ParmesanCodice