Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Ria Services, MVVM Light, Silverlight et données de conception (design time data) – Astuces

[new:25/03/2011]Lorsqu’on développe des applications Silverlight en utilisant plusieurs technologies à la fois comme les Wcf Ria Services et le toolkit MVVM Light, il peut y avoir des effets de bord imprévisibles. Notamment le non affichage des données de conception...

Tout marche bien et puis un jour, on ne sait pourquoi, les données de design ne s’affichent plus...

Pourtant MVVM Light prévoit dans le constructeur des ViewModels un test permettant de créer des données de conception en mode design (sous VS ou Blend). On vérifie, tout est ok.

On vérifie aussi que le DataContext de la page en cours est bien indiqué dans la balise d’ouverture du contrôle principal (page, UserControl...) car Blend et VS peuvent écrire cette liaison de deux façons, et la seconde (déclarée à part dans les ressources de l’objet) ne permet plus de bénéficier des dialogues de Binding sous VS... Astuce numéro 1 à se souvenir donc.

Mais malgré tout cela, les données de design continuent à se cacher !

Le plus souvent cela est du au fait que le constructeur du ViewModel échoue lorsqu’il est exécuté par VS ou Blend au design. Vérifiez que le constructeur du ViewModel ne tombe pas en exception est la première chose à faire ici. Astuce numéro 2.

Il existe un cas particulier fréquent avec les Ria Services : chaque ViewModel déclare généralement son propre contexte. Et il est tentant d’écrire un code du genre :

private MonAppliDomainContext context = new MonAppliDomainContext();

Cela permet d’initialiser le contexte Ria directement dans la déclaration de la variable context utilisée ensuite par le ViewModel pour toutes les opérations Ria Services.

Or, la création d’un Domain Context échoue en mode Design. De fait l’instance du ViewModel échoue lors de sa création (par le biais d’une construction statique dans le ViewModel Locator de MVVM Light).

Ce n’est pas le constructeur de l’objet qui plante, mais sa construction... nuance subtile rendant le debug encore plus déroutant.

L’astuce numéro 3 consiste donc à utiliser correctement les facilités offertes par MVVM Light, notamment la détection du mode Design et d’instancier les variables de type Domain Context uniquement au Runtime :

public MonViewModel()
{
    if (!IsInDesignMode) context = new MonAppliDomainContext();
    
}
 
private MonAppliDomainContext context;

Bien entendu il ne faut pas que le code Design tente d’accéder au contexte, et bien sur, cela s’étend à toute création d’instances qui ne sont pas directement utilisables au design time.

Blend et VS offrent d’autres solutions pour la création de données de Design, mais elles ne sont pas nécessaires si on utilise correctement les outils de MVVM Light. Mais j’en parlerai prochainement...

Une fois ces petits problèmes d’instanciation des ViewModels réglés, Blend et VS affichent de nouveau vos données de Design. Et la mise en page des applications s’en retrouve simplifiée.

Conclusion

Des astuces simples, mais qui rendent service...

Stay Tuned !

blog comments powered by Disqus