WPF / C #: qual è il modo accettato per un oggetto di livello inferiore di notificare l'interfaccia utente?

2

Impostazione

Facciamo il seguente esempio: Abbiamo una serie di eventi divertenti in televisione con ognuno della durata di un'ora e questo va avanti per 3 settimane. Vogliamo creare una semplice app che mostri il nome del prossimo evento.

Archiviamo l'evento nella gerarchia precedente dove Settimane può memorizzare Giorni e Giorni può memorizzare Ore etc in una raccolta (ad esempio, un ObservableCollection ), quindi è non un tipo is-a di gerarchia di oggetti, ma un ha-a tipo di gerarchia. Abbiamo, ad esempio, un TextBlock sull'interfaccia utente che visualizza il nome dell'evento successivo, quindi è un database per la proprietà Text dell'oggetto Event nella profondità della gerarchia. Diciamo che il nome dell'evento cambia improvvisamente e dobbiamo riflettere questo sull'interfaccia utente.

Il problema

Per fare questo, devo informare l'interfaccia utente che deve essere visualizzato un nome diverso. Ogni volta che affronto un problema simile, utilizzo eventi modificati come in event si attiva in Evento che notifica Ore , quindi Ore attiva anche un event che notifica Giorni ... fino a quando raggiungo il livello più alto che può notificare direttamente l'interfaccia utente. In questo modo, il event trasmesso da Eventi è sottoscritto da Ore ecc. In Bottom-Up -kind di approccio. Un modo alternativo è di rendere l'interfaccia utente stessa sottoscrivibile agli ˙eventi˙ trovati in ogni evento trovati in ogni ora ecc. Fino alla gerarchia, in un Top-Down -kind of approach.

La maggior parte delle volte, questo armeggiare funziona, ma quale sarebbe il modo accettato e corretto di notifica all'interfaccia utente in situazioni simili? Non c'è un modo più efficiente di fare questo rispetto a tutti questi abbonamenti?

Modifica

È stato portato alla mia attenzione che il modo generalmente accettato di trattare la gestione degli eventi e l'associazione dei dati in WPF è in effetti eseguito utilizzando il modello MVVM. Quindi, vorrei limitare la mia domanda a come un tale oggetto nidificato dovrebbe notificare l'interfaccia utente utilizzando questo modello.

    
posta rTECH 22.07.2017 - 13:01
fonte

2 risposte

7

In WPF il controllo dell'interfaccia utente XAML è associato al ViewModel 'low level' tramite proprietà o classi IObservable, eventi NotifiyPropertyChanged e simili.

Quando il modello di visualizzazione cambia, a causa di un'azione di controllo dell'interfaccia utente o di un thread in background, l'IU aggiornerà automaticamente.

Tuttavia, questo può comportare un intero carico di ViewModels nidificati complicati. Un'alternativa generale è usare il modello di mediatore.

Ma se stai facendo WPF la base di utenti sembra essersi stabilizzata su un pattern MVVM. Funziona bene e ci sono molti esempi e aiuta a usarlo. Meglio seguire l'esempio e impararlo.

    
risposta data 24.07.2017 - 14:01
fonte
2

Direi che è necessario un Bus eventi .

Nota importante: fermati ora e disconnetti la tua mente dall '"Evento" dalla tua domanda originale dall' "Evento" in questa risposta. Sono cose distinte. Inoltre, d'ora in poi, farò riferimento al tuo "Evento" originale come oggetto POCO.

Un Event Bus è un modo per centralizzare gli eventi a livello di sistema in un unico posto, dove diversi componenti possono sottoscrivere questi eventi (il che significa osservarli) e reagire di conseguenza.

Dovrai selezionare attentamente quali eventi sono eventi a livello di sistema (come ad esempio l'orologio sulla macchina locale modificato, o la preferenza dell'utente del fuso orario cambiato) e quali sono eventi a livello locale e non servono da propagare all'intero sistema. Non tutte le modifiche locali influiranno sul sistema nel suo complesso.

Nel tuo caso, una modifica in un oggetto POCO specifico è un evento a livello di sistema e questa modifica dovrebbe generare un evento sul bus eventi.

Ci sono alcuni grandi bus di eventi là fuori che usano accodamento di messaggi, modelli di attori, persistenza, alta resilienza, CQRS, ecc ... Non ne hai bisogno nessuno di loro. Hai solo bisogno del concetto.

Alcuni esempi di bus evento sono disponibili in questa domanda di StackOverflow . Sebbene non ne abbia mai usato nessuno (la scrittura di un bus evento locale è molto semplice), sembra che siano abbastanza semplici da usare, specialmente TinyMessenger .

Tutto ciò detto, ogni paradigma di programmazione di solito ha il proprio modo di gestire questo tipo di problemi. La risposta di Ewan presenta una cosa molto importante nel mondo WPF, che è la proprietà IObservable. Vale la pena dare un'occhiata a loro.

    
risposta data 24.07.2017 - 16:37
fonte

Leggi altre domande sui tag