Pattern per la comunicazione tra uscontrols annidati e form padre (C # / Winforms)

5

Sto cercando di decidere il modo migliore per gestire la comunicazione tra un UserControl che è annidato all'interno di un altro UserControl e il Form padre. Ho un modulo, all'interno del form c'è un UserControl con un controllo TabControl. Ogni scheda in essa è anche rappresentata con un controllo utente.

Un oggetto (per il binding) viene istanziato nel modulo e quindi passato a una proprietà nel primo UC, che quindi lo passa a una proprietà nell'UC UC nidificato. Ogni UC utilizza una BindingSource per collegare i controlli di input effettivi. Questo comportamento di collegamento a margherita diventa complicato. Ora voglio inviare un comando di salvataggio al modulo principale, quindi ho bisogno di eseguire il daisy-chain di alcuni eventi sul modulo.

Ritengo che l'intero oggetto non debba essere di proprietà del modulo padre. L'oggetto praticamente aziona l'intera applicazione, ma poiché la forma e l'interfaccia utente stavano diventando un incubo di manutenzione, ho iniziato a suddividere i componenti dell'interfaccia utente in UserControls.

Credo che le mie domande siano: - Questo sarebbe un buon posto per una sorta di modello di Localizzatore di servizi? - Devo semplicemente mantenerlo semplice con un'istanza statica singleton di questo oggetto a cui è possibile accedere da qualsiasi controllo? - Esistono altri schemi che potrebbero essere utili da consigliare?

    
posta Adam Plocher 12.07.2015 - 02:32
fonte

1 risposta

4

Puoi utilizzare il modello Mediatore.

in sostanza si ha un singolo oggetto a cui si associano gli eventi e si passa a visualizzare i modelli anziché legarsi all'evento viewmodel. così:

public interface IMediator
{
    void NotifyColleagues(string token, object args);
    void Register(string token, Action<object> callback);
    void Unregister(string token, Action<object> callback);
}

.. nella VM principale

Mediator.Register("start_Click", OnStart);

.. nella sotto VM

Mediator.NotifyColleagues("start_Click", this.data);
    
risposta data 12.07.2015 - 10:10
fonte

Leggi altre domande sui tag