Visual Studio 2010 Trucs et Astuces

Ci-dessous quelques trucs et astuces pour une utilisation optimale de Visual Studio 2010.

Les raccourcis claviers

Tout d’abord un lien vers les raccourcis clavier de Visual Studio ils vous seront très utile.
http://www.microsoft.com/download/en/details.aspx?id=13189

Si vous en avez que 6 à retenir, les voici:
_Ctrl + ‘,’ pour le « Navigate To » qui regroupe le Ctrl + N et Ctrl + Shift + N de Resharper.
_Ctrl + K + C et K + U pour commenter et dé-commenter du code.
_Ctrl + K + D pour formater le document en cours.
_F12 -> go to reference.
_Ctrl + ‘.’ affiche les aides possible.
et l’indispensable IntelliSense Ctrl+Espace.
Je ne rappellerai pas toutes les nouveautés apportées à Visual Studio 2010, ces dernières ont été assez commentées sur internet.

Activer la compilation incrémentale en tâche de fond

Disponible depuis Visual Studio 2008 Sp1, cette fonctionnalité vous permet d’avoir une vérification en continue de votre code sans avoir besoins de recompiler votre projet.
Pour l’activer, allez dans Options->Text Editor->C#->Advanced, et cocher
« Underline errors in the editor »
et « Show live semantic errors »
Pour plus de détails : http://ira.me.uk/2008/09/01/switch-offon-visual-studio-2008-background-compilation/

Afficher les numéros de ligne

Options->Text Editor->C# cocher « Line numbers »

Suivre le fichier courant dans le solution explorer

Options->Projects and Solutions cocher « Track Active Item in solution Explorer »

Plugins

Pour améliorer votre environnement vous pouvez installer les plugins (extensions) suivant:
_Resharper de jetbrains (lien)
_Highlight all occurrences of selected word (lien)
_Productivity Power Tools (lien)

Charger une image depuis le xap

Le fichier xap est un simple fichier zip.

Si vous avez besoins tout de suite de fichiers externes autant les mettre à l’intérieur. Cela permet d’améliorer le temps de téléchargement par un nombre de requête serveur moindre et vous permet de les récupérer sans problème de sécurité et de manière synchrone.

Etape 1:
Mettre les fichiers dans Visual studio avec les propriétés « Build Action » à « Content » et « Copy to Output Directory » à « Copy always ».

Etape 2:
Dans le code, pour une image utilisez une méthode dans ce style:

        private static Image ReadExternalImage(string path)
        {
            var uri = new Uri(path,
                              UriKind.Relative);
            var st = Application.GetResourceStream(uri);
            if (st == null) return null;
            Image img = new Image();
            BitmapImage bi = new BitmapImage();
            bi.SetSource(st.Stream);
            img.Source = bi;
            st.Stream.Close();
            return img;
        }

Bonne programmation,

Alexandre

Design Pattern MVVM avec une DataGrid

Pour commander une datagrid, plusieurs solution s’offre à nous. La première est de directement assigner une source à cette grille et d’écouter ces événements dans du code behind, ou, utiliser le pattern MVVM pour tout ça.

Une archive du projet final est disponible ici -> [Téléchargement introuvable]

Pour nous simplifier la tâche nous allons utiliser la bibliothèque MVVM Light Toolkit de Galasoft disponible à :
http://www.galasoft.ch/mvvm/installing/

Pour rappel, le design pattern MVVM permet de séparer la partie logique de la partie représentation graphique. Ce pattern est très proche du design pattern MVP.

MVVM est plus adapté à WPF/Silverlight et à toute techno supportant le binding.
Pour plus d’information sur ce pattern et pour ne pas réécrire la bible, je vous conseille cet article de Josh Smith: WPF Apps With The Model-View-ViewModel Design Pattern ainsi que la description sur Wikipedia.

But de l’exercice: afficher une liste d’objet (ici ‘DummyObject’) sous forme de grille interactive et suivre les actions utilisateur en séparant la partie présentation graphique de la partie logique et modèle de donnée.

Model

Notre modèle de donnée pourrait être une base de donnée, un web service, un autre composant, …etc. Ce n’est qu’une source que le ViewModel va transformer ou simplement transmettre à la vue.

ViewModel

Commençons par la partie logique et représentation du modèle de notre viewModel ‘EvaluateSCViewModel’.

Il doit permettre au minimum:

  • d’accéder / modifier par binding toutes les données à afficher, ici ItemSource et SelectedItem pour l’élément sélectionné.
  • de suivre les actions utilisateur, ici les évènements de changement de sélection + focus

l’héritage de ViewModelBase nous permet, entre autre, d’avoir une implémentation de INotifyPropertyChanged pour la mise à jour des propriétés par binding.

Ainsi il est important que chaque valeur de propriété soit bindable. Si le type est complexe, il doit implémenter INotifyPropertyChanged afin de maintenir la vue informée des changements.
Par contre, rien ne vous empêche d’utiliser des interfaces de plus bas niveau comme ICollection

Dans l’exemple fourni, 2 méthodes permettent de suivre le changement de sélection suivant vos besoins.
Soit par l’intermédiaire d’une propriété bindable représentant la valeur de la grille.
Soit par une commande ‘ICommand’ levée lors du changement de sélection.
Une autre implémentation plus complexe est possible:
http://weblogs.asp.net/alexeyzakharov/archive/2009/06/06/silverlight-tips-amp-tricks-make-silverlight-datagrid-be-more-mvvm-friendly.aspx

View

La vue est la représentation graphique du ViewModel, rien de plus, sauf quelques animations.
Ce fait est explicité par l’assignation du ViewModel au contexte de donnée de la vue.
Ceci ce fait par
le code Xaml ‘DataContext= »{Binding Source={StaticResource EvaluateSCViewModel}} »‘
ou le code C# ‘DataContext = new EvaluateSCViewModel();’

Une fois le contexte du composant assigné, la DataGrid peut être liée au différentes propriétés du ViewModel.

  • La source de donnée de la datagrid: « ItemsSource= »{Binding ItemSource} » »
  • l’élément sélectionné : « SelectedItem= »{Binding SelectedItem, Mode=TwoWay} » »
  • Pour les composants ne supportant nativement les commandes, on peut utiliser un EventTrigger. Un exemple ici fait doublon avec SelectedItem avec la commande SelectionChangedCommand sur l’événement SelectionChanged.

Remarque sur l’injection

Si vous utilisez l’injection, vous aurez besoins de la liaison View-ViewModel seulement pendant le temps de design. Vous pouvez simplement écrire en Xaml: ‘d:DataContext= »{Binding Path=ShoppingCartViewModel, Source={StaticResource serviceLocator}} »‘ Ensuite il suffit d’assigner chaque propriétés du ViewModel aux propriétés de la vue.
ItemSource à la DataGrid: ItemsSource= »{Binding ItemSource} »
les commandes au boutons, …etc.

Pour aller plus loin:
http://edventuro.us/2010/03/porting-a-wpf-app-with-the-model-view-viewmodel-design-pattern-to-silverlight-4/