Bonjour,
voilà j'aurais voulu avoir un petit exemple pour ajouter des items d'une combobox à partir d'un type enum.
Merci d avance!
Bonjour,
voilà j'aurais voulu avoir un petit exemple pour ajouter des items d'une combobox à partir d'un type enum.
Merci d avance!
va renvoyer un string[] contenant les nom disponibles dans l'enum qui peut être utilisé comme DataSource.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Enum.GetNames(typeof(MonEnum));
Salut,
voici une méthode pour binder un enum sur une combobox :
le xaml :
tu places cela dans les ressources de ta window :
Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <CollectionViewSource x:Key="TypeEnumList"> <CollectionViewSource.Source> <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type sys:Enum}"> <ObjectDataProvider.MethodParameters> <x:Type TypeName="localvm:TypeEnum"/> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> </CollectionViewSource.Source> </CollectionViewSource>
et la combobox :
Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <ComboBox Name="Cbo_TypeEnum" ItemsSource="{Binding Source={StaticResource TypeEnumList}}" HorizontalAlignment="Left" Width="280">
view model :
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public enum TypeEnum { ALL, RUNTIME, SQL }
Merci bien !!!
Hello,
Sinonj'ai un petit converter qui va chercher l'attribut Display que tu as placé sur un enum et te renvoit un tuple avec la valeur de l'enum et le texte a affiché. C'est bien pratique et cela s'utilise en fournissant le type de l'enum a utiliser depuis le code :
Code ENUM:
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public enum MonENum{ [Display(Name="Mon nom a afficher un")] ValeurUne, [Display(Name="Mon nom a afficher deux")] ValeurDeux, }
Code XAML:
Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <ComboBox ItemsSource="{Binding LeTypeDeLEnum,Converter={StaticResource EnumToDictionnaryConverter}}" DisplayMemberPath="Item2" SelectedValuePath="Item1" SelectedValue="{Binding SelectedObjectOnViewModel,Mode=TwoWay}" />
Code du converter :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 public class EnumToDictionnaryConverter : IValueConverter { private Dictionary<Type, List<Tuple<Object, Object>>> cache = new Dictionary<Type, List<Tuple<Object, Object>>>(); public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Type type = value as Type; if (!this.cache.ContainsKey(type)) { var fields = type.GetFields().Where(field => field.IsLiteral); var values = new List<Tuple<Object, Object>>(); foreach (var field in fields) { DisplayAttribute[] a = (DisplayAttribute[])field.GetCustomAttributes(typeof(DisplayAttribute), false); if (a != null && a.Length > 0) { Tuple<object, object> newTuple1 = new Tuple<Object, Object>(field.GetValue(value), a[0].Name); values.Add(newTuple1); } else { Tuple<object, object> newTuple = new Tuple<Object, Object>(field.GetValue(value), field.GetValue(value)); values.Add(newTuple); } } this.cache[type] = values; } return this.cache[type]; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
La technique du ObjectDataProvider fonctionne bien, mais c'est un peu lourd...
La librairie Dvp.NET fournit une markup extension EnumValuesExtension qui fait la même chose de façon beaucoup plus compacte :
Code XML : Sélectionner tout - Visualiser dans une fenêtre à part <ComboBox ItemsSource="{dvp:EnumValues local:MyEnum}" />
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Hello,
je me permets de relancer ce (vieux) sujet car j'ai une question sur la réponse de jmix90:
J'ai évidemment remplacé LeTypeDeLEnum par mon type d'énumération. Le compilateur indique (à juste titre) qu'il ne trouve pas la propriété LeTypeDeLEnum sur l'objet lié au DataContext.Envoyé par jmix90
Est-ce que c'est la bonne syntaxe ?
Merci d'avance,
Zoax
Partager