Come impedire la ricorsione degli eventi di endles quando si utilizza la visualizzazione dei dati guidata dagli eventi?

3

Considera che hai un'interfaccia grafica che rappresenta una struttura dati. Ad esempio un campo di testo:

Questocampoèconnessoallastrutturadatiattraversoeventi.Hoprovatoafareundiagrammadiquesto:

Naturalmente, ci possono essere molti elementi della GUI e la struttura può essere complessa. Quello che succede è che quando i valori della GUI vengono modificati dall'utente, la struttura viene aggiornata. Quando la struttura viene modificata da un'altra fonte, notifica la GUI della modifica.

Che cosa devo fare per impedire il loop delle connessioni? Ho pensato di avere alcune funzioni setter "silenziose", ma questo sembra sporco. Come dovrebbe essere il modello correttamente?

    
posta Tomáš Zato 10.06.2016 - 11:48
fonte

1 risposta

3

Un modo per ottenere ciò che stai chiedendo con modifiche minime al codice è controllare sia la vista che il modello se i dati sono effettivamente cambiati quando arriva una notifica prima di eseguire un aggiornamento / notifica.

Esempio di flusso di programma:

  1. L'utente imposta il campo di testo su "Qualche testo".
  2. GUI invia una notifica di aggiornamento al modello con il nuovo valore.
  3. Il modello controlla che il valore sia effettivamente cambiato, imposta il nuovo valore e quindi invia una notifica di aggiornamento che viene rilevata dalla GUI.
  4. GUI controlla se il valore proveniente dal modello è diverso da quello che ha, trova che è lo stesso e quindi non esegue un aggiornamento / notifica.

Esempio di codice:

if(newData != data)
{
    data = newData;
    notify(data);
}

Il problema di avere un setter silenzioso è che potrebbero esserci altri componenti della tua applicazione che devono sapere quando il modello è cambiato ma non verrà notificato.

    
risposta data 10.06.2016 - 12:42
fonte

Leggi altre domande sui tag