Explication de code source de combobox

Ammar.Dev Messages postés 52 Date d'inscription mercredi 5 octobre 2005 Statut Membre Dernière intervention 28 janvier 2021 - 19 janv. 2018 à 14:25
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 20 janv. 2018 à 00:04
bonsoir je trouve ce code source qui me permet de faire un binding directement a travers l'enumeration mais je ne comprends pas cette instruction
public IList<UserType> UserTypes
{
    get
    {
        // Will result in a list like {"Tester", "Engineer"}
        return Enum.GetValues(typeof(UserType)).Cast<UserType>().ToList<UserType>();
    }
}
 
public UserType UserType
{
	get;
	set;
}

sachant que ce code je le trouve dans ce site :http://www.ridgesolutions.ie/index.php/2014/11/05/wpf-xaml-binding-combobox-directly-to-enum-values/

Merci :)

1 réponse

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
20 janv. 2018 à 00:04
Bonsoir
déjà pour que ce code fonctionne, il faut le copier coller correctement....
On a besoin de la définition de UserType pour te l'expliquer.

Jusqu'à présent, tes questions concernaient Winform, le site d'où tu tires ce code montre un binding en WPF.
En WPF, plus qu'en Winform, il est important de respecter le MVC.
En effet, le binding étant très nettement plus puissant, l'utilisation de vue(s) est parfaitement adaptée.
La partie de code behing, présenté ici, est justement un extrait d'une vue, c'est pour cela que dans le code d'origine il y avait // au début et à la fin, pour dire "y'a du code avant et du code après".
Note que cet extrait de vue, pourrait servir en Winform.

En mettant les extraits de codes complets
public enum UserType
{
    Tester,
    Engineer
}

Donc UserType est une énumération à 2 valeur "Tester" et "Engineer", valant respectivement 0 et 1.

//
public IList<UserType> UserTypes
{
    get
    {
        // Will result in a list like {"Tester", "Engineer"}
        return Enum.GetValues(typeof(UserType)).Cast<UserType>().ToList<UserType>();
    }
}
 
public UserType UserType
{
	get;
	set;
}
//


UserType est une propriété de la vue (on voit plus souvent la notation
public UserType UserType { get; set; }
du type UserType. Bon s'agissant d'un exemple "pédagogique", il aurait été plus judicieux de nommer la propriété différemment du type.
Pour la suite on va partir du principe que c'est
public UserType MonUser { get; set; }


UsersTypes est une propriété en lecture seul (y'a pas de set), du type IList de UserType. Cette fois c'est bien nommé, le s montre tout de suite qu'ils s'agit d'une collection de UserType.

Enum.GetValues(typeof(UserType))
retourne un "tableau" contenant toutes les valeurs de l'énumération (en fait c'est un Array et pas un UserType[]).
Cast<UserType>().
caste le tableau en ienumerable<UserType>
ToList<UserType>()
et caste en List<UserType>, List implémentant IList on est bon.
Par contre le commentaire est incorrect, en effet le contenu de la liste est
{ UserType.Tester, UserType.Engineer}


Donc notre vue dispose d'une liste avec toutes les valeurs de l'énumération et d'un propriété du type de l'énumération.

<ComboBox SelectedValue="{Binding MonUser, Mode=TwoWay}" ItemsSource="{Binding UserTypes}"/>

Cette ligne déclare le contrôle, et lui donne ses paramètres de binding.
Cela part du principe, que la vue est le DataContext de la fenêtre entière, et ce principe est très certainement expliqué dans un post précédent.
La valeur sélectionnée est bindée sur la propriété MonUser et le binding est à double sens, au démarrage la fenêtre va afficher la valeur de la vue, puis les actions de l'utilisateur vont affecter la propriété. Cependant, si la valeur de la vue est modifiée en cours d'exécution via le code, il peut ne pas y avoir de mise à jour de la fenêtre, car la vue n'implémente pas IPropertyChanged.
Ensuite l'ensemble des éléments à afficher dans la liste déroulante du combobox sont pris dans la liste. Ce binding est forcément unidirectionnel puisque la propriété est en lecture seule.


0
Rejoignez-nous