Poniższe wydaje się dość powszechnym wzorem (dla mnie, nie dla całej społeczności) do wiązania zmiennej łańcuchowej do zawartości TextBox.Jak mogę zapobiec nieskończonej rekursji podczas używania zdarzeń do wiązania elementów interfejsu użytkownika z polami?
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;
}
}
Problem polega na tym, że zmiana TextBox wyzwala zmianę wartości danych w backend, który powoduje, że pole tekstowe, aby zmienić itp, który działa zawsze.
Czy istnieje lepszy wzór projektu (oprócz użycia nieprzyjemnej flagi boolowskiej), który obsługuje ten przypadek poprawnie?
EDYCJA: Aby było jasne, w prawdziwym projekcie klasa zaplecza służy do synchronizowania zmian między wieloma formularzami. Dlatego nie mogę po prostu użyć właściwości SomeTextBox.Text bezpośrednio.
Billy3
Jestem zdezorientowany. Ustawienie TextBox.Text na tę samą wartość dwa razy z rzędu powoduje, że ** jedno zdarzenie TextChanged zostanie wywołane? – ParmesanCodice
@ParmesanCodice: Nie. Za każdym razem, gdy ktoś zmieni zawartość pola tekstowego - nawet jeśli zawartość napisanego ciągu nie zmieni się - zdarzenie TextChanged zostanie wywołane. –
dziwne, że prowadzę program w tej chwili, nie widząc tego zachowania. – ParmesanCodice