55 votes

Comment lier une ComboBox à un dictionnaire générique via ObjectDataProvider ?

Je veux remplir une ComboBox avec des données clé/valeur dans le code derrière, j'ai ceci :

XAML :

<Window x:Class="TestCombo234.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestCombo234"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <ObjectDataProvider x:Key="Choices" ObjectType="{x:Type local:CollectionData}" MethodName="GetChoices"/>
    </Window.Resources>
    <StackPanel HorizontalAlignment="Left">
        <ComboBox ItemsSource="{Binding Source={StaticResource Choices}}"/>
    </StackPanel>
</Window>

Code Behind :

using System.Windows;
using System.Collections.Generic;

namespace TestCombo234
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    }

    public static class CollectionData
    {
        public static Dictionary<int, string> GetChoices()
        {
            Dictionary<int, string> choices = new Dictionary<int, string>();
            choices.Add(1, "monthly");
            choices.Add(2, "quarterly");
            choices.Add(3, "biannually");
            choices.Add(4, "yearly");
            return choices;
        }
    }
}

Que dois-je changer pour que la clé soit l'int et la valeur la chaîne de caractères ?

0 votes

1 votes

Il semble que l'image dans votre question ci-dessus est cassée (et maintenant afficher une publicité à la place ). Pourriez-vous télécharger à nouveau l'image sur stack.imgur ou modifier votre question pour la supprimer ?

126voto

Bryan Anderson Points 9044

Dans votre ComboBox, ajoutez

SelectedValuePath="Key" DisplayMemberPath="Value"

3 votes

Je pense que vous voulez dire SelectedValuePath et DisplayMemberPath. Ceux-ci ont fonctionné pour moi en tout cas, merci.

0 votes

Oups, oui je l'ai fait. Je vais corriger la réponse.

3 votes

En outre, SelectedValue="{Binding myViewModelProperty}" est bon à ajouter aussi si vous voulez obtenir la sélection de l'utilisateur.

5voto

Jim Points 21

Il y a un moyen plus facile.

Convertir l'énumération en un objet Generic.Dictionary. Par exemple, disons que vous voulez une boîte combo avec le jour de la semaine (convertissez simplement le VB en C#).

Dim colWeekdays As New Generic.Dictionary(Of FirstDayOfWeek, String)
    For intWeekday As FirstDayOfWeek = vbSunday To vbSaturday
       colWeekdays.Add(intWeekday, WeekdayName(intWeekday))
    Next

RadComboBox_Weekdays.ItemsSource = colWeekdays

Dans votre XAML, il vous suffit de définir les éléments suivants pour vous lier à un objet :

SelectedValue="{Binding Path= StartDayNumberOfWeeek}"  SelectedValuePath="Key" 
DisplayMemberPath="Value" />

Le code ci-dessus peut facilement être généralisé en utilisant la réflexion pour gérer toutes les énumérations.

J'espère que cela vous aidera

0voto

juagicre Points 426

La manière DevExpress 17.1.7 handles this is setting those properties : DisplayMember et ValueMember Dans le cas d'un dictionnaire, ce serait quelque chose comme ceci :

DisplayMember="Value" 
ValueMember="Key"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X