Explication de code source de combobox

Ammar.Dev 59 Messages postés mercredi 5 octobre 2005Date d'inscription 19 janvier 2018 Dernière intervention - 19 janv. 2018 à 14:25 - Dernière réponse : Whismeril 10825 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 janvier 2018 Dernière intervention
- 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 :)
Afficher la suite 

1 réponse

Répondre au sujet
Whismeril 10825 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 janvier 2018 Dernière intervention - 20 janv. 2018 à 00:04
0
Utile
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.


Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.