web-dev-qa-db-fra.com

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

Je veux remplir un ComboBox avec des données de 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 derrière:

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;
        }
    }
}

Mais cela me donne ceci:

texte alternatif http://img193.imageshack.us/img193/9218/choices.png

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

46
Edward Tanguay

À votre ComboBox ajoutez

SelectedValuePath="Key" DisplayMemberPath="Value"
111
Bryan Anderson

Il existe un moyen plus simple.

Convertissez l'énumération en un objet Generic.Dictionary. Par exemple, disons que vous vouliez une zone de liste déroulante 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 ce qui suit pour se 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 t'aides

4
Jim

La façon dont DevExpress 17.1.7 gère cela définit ces propriétés: DisplayMember et ValueMember, dans le cas d'un dictionnaire, ce serait quelque chose comme ceci:

DisplayMember="Value" 
ValueMember="Key"
0
juagicre