Quanto segue sembra essere un modello relativamente comune (per me, non per la comunità in generale) per associare una variabile stringa al contenuto di un controllo TextBox.Come posso evitare la ricorsione infinita quando si usano eventi per collegare elementi dell'interfaccia utente ai campi?
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;
}
}
Il problema è che il cambiamento di TextBox spara cambia il valore dei dati nel backend, che fa sì che la casella di testo per cambiare, ecc che corre sempre.
Esiste un modello di progettazione migliore (diverso dal ricorso a una brutta bandiera booleana) che gestisce correttamente questa custodia?
MODIFICA: Per essere chiari, nel progetto reale la classe di backend viene utilizzata per sincronizzare le modifiche tra più moduli. Pertanto non posso semplicemente usare direttamente la proprietà SomeTextBox.Text.
Billy3
Sono confuso. L'impostazione di TextBox.Text sullo stesso valore due volte di seguito causa solo ** un evento ** TextChanged da attivare? – ParmesanCodice
@ParmesanCodice: No. Ogni volta che qualcuno cambia il contenuto della casella di testo, anche se il contenuto della stringa contenuta non cambia, viene generato l'evento TextChanged. –
strano sto eseguendo il programma in questo momento, non vedendo quel comportamento. – ParmesanCodice