Mi proyecto WPF será organizados así:desacoplar las pantallas sin cuerdas mágicas
Screens
Group1
Screen1
View.xaml
ViewModel.cs
Group2
Screen2
View.xaml
ViewModel.cs
Para mostrar el Screen1
del Screen2
voy a utilizar algo como esto: ScreenManager.Show("Group1.Screen1")
Esta apariencia (utilizando la reflexión) en el Screens.Group1.Screen1
espacio de nombres para una vista y un modelo de vista y los crea una instancia.
¿Cómo puedo eliminar la cadena mágica sin acoplamiento Screen1
y Screen2
(no quiero que las clases en Screen2
utilizar el espacio de nombres Screen1
). También me gustaría algún tipo de descubrimiento de pantalla (autocompletado/intellisense)
O tal vez de alguna manera (prueba de automatización) para verificar que todas las llamadas a ScreenManager.Show
son válidas.
Actualización: me ocurrió esto:
public class ScreenNames
{
public Group1Screens Group1;
public class Group1Screens
{
public ScreenName Screen1;
}
}
public sealed class ScreenName
{
private ScreenName() { }
}
public class ScreenManager : IScreenManager
{
public void Show(Expression<Func<ScreenNames, ScreenName>> x) {}
}
Uso:
screenManager.Show(x=>x.Group1.Screen1);
No es ideal pero supongo violando DRY es aún mejor que las cadenas mágicas. Y puedo probar automáticamente (con reflejo) que todas las llamadas son válidas.
¿Por qué Screen2 necesita saber acerca de Screen1? ¿No existe el administrador de pantalla fuera de cada una de las pantallas? Y con Intellisense, ¿está diciendo que durante el desarrollo desea que cada uno de los nombres de la pantalla aparezca en la lista desplegable cuando comienza a escribir ScreenManager.Show()? ¿La lista de pantallas estática o dinámica (cargada en tiempo de ejecución)? – Dave
Eventualmente pasaré un parámetro; ScreenManager será una propiedad de ViewModel; Para intellisense, creo que una lista estática es imprescindible:/ Creo que podría tener algo como esto: ScreenManager.Show (x => x.Group1.Screen1) –
uso como ScreenManager.Show (x => x.Group1.Screen1) significa que tendré que mantener y mantener una lista separada de pantallas, pero creo que no hay otra manera si quiero intellisense –