2009-10-22 6 views
40

Je veux remplir une zone de liste déroulante avec des données clé/valeur dans le code derrière, j'ai ceci:Comment lier un ComboBox dictionnaire générique via ObjectDataProvider

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:

alt text http://img193.imageshack.us/img193/9218/choices.png

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

+0

Google révèle ceci: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6f9ff9a9-9133-40cc-bfdb-a47d340658bf – Heinzi

+1

On dirait que le l'image dans votre question ci-dessus est cassée (et maintenant [montrant une annonce à la place] (http://meta.stackexchange.com/questions/263771/ban-imageshack-images-parce que-les-ont-utilisé-sur-leurs-pour -La publicité)). Pourriez-vous s'il vous plaît ré-uploader l'image à stack.imgur, ou éditer votre question pour l'enlever? –

Répondre

98

Pour votre ComboBox ajouter

SelectedValuePath="Key" DisplayMemberPath="Value" 
+2

Je pense que vous voulez dire SelectedValuePath et DisplayMemberPath, ceux qui ont travaillé pour moi au moins, merci. –

+0

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

+3

Vous êtes mon héros! –

4

Il y a un moyen plus facile.

Convertissez l'énumération en objet Generic.Dictionary. Par exemple laisser dire que vous vouliez une boîte combo avec le jour de la semaine (il suffit de convertir 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 paramètres suivants 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.

espérons que cette aide

Questions connexes