Ho risolto questo problema aggiungendo un Presenter . Essenzialmente, il presentatore è un intermediario. Tutte le interazioni tra l'interfaccia utente e il "back-end", come lo chiami, passano attraverso il presentatore.
Ora assumendo che quando affermi che "qualsiasi parte dell'applicazione può aggiungere, rimuovere e, soprattutto, modificare i dettagli di tali oggetti in qualsiasi momento", presumo cosa intendi per le parti in grado di avviare una sorta di modifica iniziano sempre dal livello dell'interfaccia utente (a meno che, naturalmente, non sia in esecuzione qualche tipo di attività asincrona in background ...)
Poiché tutte le azioni sono avviate dall'interfaccia utente, il relatore sa quando qualsiasi cosa accade che potrebbe cambiare lo stato. Il presentatore è responsabile della notifica delle parti rilevanti dell'interfaccia utente dopo che qualcosa accade che potrebbe influire sul suo stato. La soluzione ingenua, ma completamente realizzabile in molti casi, è quella di notificare sempre tutte le parti visualizzate dell'interfaccia utente dopo ogni azione avviata dall'interfaccia utente. (Questo è praticabile perché nella maggior parte dei casi l'interfaccia utente è una rappresentazione appiattita di una piccola parte del "back-end", quindi di solito non ci sono molte informazioni da sincronizzare - la quantità di dati è limitata dal reale schermo fisico- proprietà.) La notifica può essere qualsiasi meccanismo (nel mio, notifico solo l'oggetto dell'interfaccia utente superiore dell'albero e passa il messaggio a tutti gli oggetti dell'interfaccia utente figlio). Ogni oggetto dell'interfaccia utente è quindi responsabile di esaminare lo stato corrente, determinare se qualcosa è cambiato e quindi aggiornare ciò che sta visualizzando, se necessario.
Un'altra alternativa: un bus dei messaggi. È un po 'più pulito degli eventi (con gli eventi devi collegare e sganciare gli eventi da / a oggetti, e se dimentichi, ottieni l'equivalente di perdite di memoria). Con un bus dei messaggi, qualsiasi oggetto può inviare un messaggio: "qualcosa è cambiato!" e chiunque può iscriversi a quei messaggi. Ad esempio, controlla l'infrastruttura di messaggistica in MVVM Light. È bello in quanto utilizza i riferimenti software, quindi non ha il potenziale problema di perdita di memoria degli eventi.