WPF puede ser exasperante a veces.¿Cuál es la mejor forma de compartir datos entre una ventana de WPF y sus controles de usuario?
Tengo una aplicación bastante simple que consiste en una única ventana principal que contiene un control de pestañas y varias pestañas. No me gustó la idea de tener el código para todas las pestañas en el mismo archivo, así que utilicé la respuesta de this question para dividir cada pestaña en un control de usuario diferente.
Dentro de la ventana principal tengo una instancia de un objeto que contiene la configuración de la aplicación y algunos otros datos de toda la aplicación. Varias de mis pestañas requieren acceso a estos datos para fines de enlace de datos. No he podido encontrar una buena manera de lograr esto.
Primero intenté acceder a la ventana padre en el evento cargado Controles y obtener una referencia a la propiedad en la ventana principal que expuso el objeto de configuración, como se muestra en el siguiente código. Este tipo de trabajo funciona, excepto que el evento Loaded se activa cada vez que la pestaña gana foco. Además, este evento se produce tarde en el ciclo de vida de control, por lo que no puedo enlazar a ninguna de las propiedades en este objeto en los controles de usuario XAML.
private void MyUserControl_Loaded(object sender, RoutedEventArgs e)
{
this.ApplicationSettings = ((MainWindow)Window.GetWindow(this)).ApplicationSettings;
}
Entonces experimentó con pasar los datos al usuario controles constructor, pero no hay manera de hacerlo en XAML.
Dado que estos son ajustes de toda la aplicación, podría hacer que la clase ApplicationSettings fuera singleton y hacer referencia a ella en todas partes, pero preferiría no hacer eso para pruebas de unidades.
Entonces, ¿cómo se logra algo como esto? ¿Mi enfoque es fundamentalmente defectuoso? En mi opinión, todos estos elementos de la interfaz de usuario son parte de la misma ventana y, por lo tanto, deberían poder acceder a los datos desde la ventana principal, pero el modelo de objetos no parece permitir esto.
Creo que esta es la ruta que voy a tomar. Como dije en la publicación original, quiero un comportamiento singleton sin el singleton real, y esto me da eso. En realidad, probablemente haga la clase singleton, pero dejaré el constructor público para fines de prueba. Gracias! – EricTheRed