2009-10-22 6 views
40

Chcę wypełnić ComboBox z danymi klucz/wartość w kodzie tyłu, mam to:Jak powiązać ComboBox do ogólnych słowniku poprzez 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 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; 
     } 
    } 
} 

Ale to daje mi to:

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

Co muszę zmienić tak, że klucz jest int, a wartość jest łańcuch?

+0

Google ujawnia w ten sposób: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6f9ff9a9-9133-40cc-bfdb-a47d340658bf – Heinzi

+1

Wygląda na to, obrazek w powyższym pytaniu jest zepsuty (a teraz [wyświetla reklamę zamiast] (http://meta.stackexchange.com/questions/263771/ban-imageshack-images-ponieważ-to-używanie-pełnych-urlów-do -reklama)). Czy możesz ponownie załadować obraz do pliku stack.imgur lub edytować pytanie, aby go usunąć? –

Odpowiedz

98

do Twojego ComboBox dodać

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

Myślę, że masz na myśli SelectedValuePath i DisplayMemberPath, te przynajmniej dla mnie działały, dziękuję. –

+0

Ups, tak, zrobiłem. Naprawię odpowiedź. –

+3

Jesteś moim bohaterem! –

4

Jest łatwiejszy sposób.

Konwertuj wyliczenie na obiekt Generic.Dictionary. Na przykład powiedzmy chciał pole kombi z tygodnia (tylko przekonwertować VB do 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 

W swojej XAML trzeba tylko ustawić następujące powiązać do obiektu:

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

Powyższy kod można łatwo uogólnić za pomocą odbicia, aby obsłużyć dowolne wyliczenia.

nadzieję, że to pomaga