WPF può essere irritante a volte.Qual è il modo migliore per condividere i dati tra una finestra WPF e i suoi controlli utente?
Ho un'applicazione abbastanza semplice che consiste in una singola finestra principale che contiene un controllo struttura a schede e diverse schede. Non mi piaceva l'idea di avere il codice per tutte le schede nello stesso file, quindi ho usato la risposta da this question per scomporre ogni scheda in un controllo utente separato.
Nella mia finestra principale ho un'istanza di un oggetto che contiene le impostazioni dell'applicazione e alcuni altri dati a livello di applicazione. Molte delle mie schede richiedono l'accesso a questi dati per scopi di associazione dei dati. Non sono stato in grado di trovare un buon modo per realizzare questo.
Prima ho provato ad accedere alla finestra padre nei controlli evento Loaded e ottenere un riferimento alla proprietà nella finestra principale che ha esposto l'oggetto impostazioni, come mostrato nel codice sottostante. Questo tipo di operazioni, ad eccezione dell'evento Loaded, viene attivato ogni volta che la scheda viene messa a fuoco. Inoltre, questo evento si verifica in ritardo nel ciclo di vita del controllo, quindi non sono in grado di eseguire il binding a nessuna delle proprietà in questo oggetto nel controllo utente XAML.
private void MyUserControl_Loaded(object sender, RoutedEventArgs e)
{
this.ApplicationSettings = ((MainWindow)Window.GetWindow(this)).ApplicationSettings;
}
Poi ho sperimentato con il passaggio dei dati nel costruttore di controlli utente, ma non c'è modo di farlo in XAML.
Dato che si tratta di impostazioni a livello di applicazione, è possibile rendere la classe ApplicationSettings singleton e farne riferimento ovunque, ma preferirei non farlo per scopi di testing unitario.
Quindi come si realizza qualcosa del genere? Il mio approccio è fondamentalmente sbagliato? Nella mia mente tutti questi elementi dell'interfaccia utente fanno parte della stessa finestra e pertanto dovrebbero essere in grado di accedere ai dati dalla finestra principale, ma il modello a oggetti non sembra consentirlo.
Penso che questa sia la strada che prenderò. Come ho detto nel post originale, voglio un comportamento singleton senza il singolo singleton, e questo mi dà questo. In realtà, probabilmente renderò la classe singleton, ma lascerò il costruttore a scopi di test. Grazie! – EricTheRed