Mon projet WPF sera organisé comme ceci:découpler les écrans sans cordes magiques
Screens
Group1
Screen1
View.xaml
ViewModel.cs
Group2
Screen2
View.xaml
ViewModel.cs
Pour afficher la Screen1
du Screen2
je vais utiliser quelque chose comme ceci: ScreenManager.Show("Group1.Screen1")
Cette apparence (réflexion à l'aide) dans le Screens.Group1.Screen1
namespace pour une vue et un ViewModel et les instancie.
Comment puis-je éliminer la chaîne magique sans accouplement Screen1
et Screen2
(je ne veux pas que les classes Screen2
d'utiliser l'espace de noms Screen1
). Aussi je voudrais une sorte de découverte d'écran (autocompletion/intellisense)
Ou peut-être d'une certaine manière (automatiser le test) pour vérifier que tous les appels à ScreenManager.Show
sont valides.
Mise à jour: je suis venu avec ceci:
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) {}
}
Utilisation:
screenManager.Show(x=>x.Group1.Screen1);
Pas idéal mais je suppose violais DRY est encore mieux que les chaînes magiques. Et je peux automatiquement tester (avec réflexion) que tous les appels sont valides.
Pourquoi Screen2 a besoin de savoir à propos de Screen1? Le gestionnaire d'écran n'existe-t-il pas en dehors de chacun des écrans? Et par Intellisense, vous dites que pendant le développement, vous voulez que chaque nom de l'écran apparaisse dans la liste déroulante quand vous commencez à taper ScreenManager.Show()? La liste des écrans est-elle statique ou dynamique (chargée à l'exécution)? – Dave
Finalement, je vais passer un paramètre; ScreenManager sera une propriété de ViewModel; Pour intellisense je pense qu'une liste statique est un must:/ Je pense que je pourrais avoir quelque chose comme ceci: ScreenManager.Show (x => x.Group1.Screen1) d'utilisation –
comme ScreenManager.Show (x => x.Group1.Screen1) voudrait dire que je vais devoir garder et maintenir une liste séparée des écrans, mais je pense qu'il n'y a pas d'autre façon, si je veux IntelliSense –