6
votes

I grabbed this code from MSDN. What Im trying to do is similar, but use a list instead of three different strings. so say

List<string> strList = new List<string>();
strList.Add("Created with C#");
strList.Add("Item 2");
strList.Add("Item 3");

  //MSDN CODE BELOW
    cbox = new ComboBox();
        cbox.Background = Brushes.LightBlue;
        cboxitem = new ComboBoxItem();
        cboxitem.Content = "Created with C#";
        cbox.Items.Add(cboxitem);
        cboxitem2 = new ComboBoxItem();
        cboxitem2.Content = "Item 2";
        cbox.Items.Add(cboxitem2);
        cboxitem3 = new ComboBoxItem();
        cboxitem3.Content = "Item 3";
        cbox.Items.Add(cboxitem3);

        cv2.Children.Add(cbox);

Tried to do cbox.Items.Add(strList); Also tried a forloop to loop through each element, but that doesn't work either. Any ideas how I can achieve this?

enter image description here

XAML:

          <Grid x:Name="grid44" DataContext="{StaticResource tBLPERMITSViewSource}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="409">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <Label Content="SPR PACKET ASSIGMENT" Grid.Column="0" HorizontalAlignment="Left" Margin="3" Grid.Row="0" VerticalAlignment="Center" FontWeight="Bold"/>
                            <ComboBox x:Name="sPR_ASSIGNEDComboBox" Grid.Column="1" DisplayMemberPath="SPR_ASSIGNED" HorizontalAlignment="Left" Height="Auto" Text="{Binding SPR_ASSIGNED}" ItemsSource="{Binding Items}" Margin="3,5,-114.35,5" Grid.Row="0" VerticalAlignment="Center" Width="238.35" Background="White" IsReadOnly="True" IsEditable="True" >

                            </ComboBox>
                        </Grid>
4
Have you tried setting the .ItemsSource property of the combobox to a list of strings? e.g cbox.ItemsSource = new list<string>{"item1", "item2", "item3"}; - User92
I have, it shows up blank. but with the right amount of items in the list though. Not sure whats happening. - Gisiota
What do you mean by 'it shows up blank'? - User92
So if I add say five items to a list, under the combobox ill see five empty slots. Ill add an image so you see what I mean. (in the image: "bro" is brought from the property of the xaml text="{binding field"}". Ill also add the xaml to make things more clear.) the content of combobox is brought from the list, but its not showing the string text. - Gisiota
Is it a standard WPF combobox, or you have you edited the template for it? - User92

4 Answers

9
votes

Set the items programmatically:

Code-behind:

    private void PopulateComboBox()
    {
        cBox.ItemsSource = new List<string> { "Item1", "Item2", "Item3"};
    }

XAML:

<ComboBox Width="200" Height="30"  x:Name="cBox" />

Bind to a collection of items:

    public class DummyClass
    {
        public int Value { get; set; }
        public string DisplayValue { get; set;}
    }

    public ObservableCollection<DummyClass> DummyClassCollection
    {
        get
        {
            return new ObservableCollection<DummyClass>
            {
                new DummyClass{DisplayValue = "Item1", Value = 1},
                new DummyClass{DisplayValue = "Item2", Value = 2},
                new DummyClass{DisplayValue = "Item3", Value = 3},
                new DummyClass{DisplayValue = "Item4", Value = 4},
            };
        }
    }

XAML:

<ComboBox Width="200" Height="30"  x:Name="cBox" ItemsSource="{Binding DummyClassCollection}" DisplayMemberPath="DisplayValue" />
3
votes

If you don't want to do this following a binding/mvvm pattern, it is quite simple to just do the following:

foreach (var item in items)
{
    _comboBox.Items.Add(item);
    _comboBox.SelectedValuePath = "ID";
    _comboBox.DisplayMemberPath = "Name";
}

Which can be accessed later like so:

var id = _comboBox.SelectedValue;
0
votes

You can use data binding. Data binding allows you to bind the dynamic data from your list to the combobox and have it generated and filled with the content you are passing through.

Binding WPF Combobox to a Custom List

0
votes

I solved Add and Remove ComboBox items from code behind simply by synchronization of my dictionary Ienumerable Keys with the ComboBox ItemsSource property, and then making a Refresh() of Items property when adding or removing items:

Dictionary<string,Object> dico=new Dictionary<string,Object>();
dico.Add("obj1",obj1);
dico.Add("obj2",obj2);
dico.Add("obj3",obj3);
...
ComboBox combobox=new ComboBox();
combobox.ItemsSource=dico.Keys;

string key=a_key;
Object obj=an_object;
// add //
if (dico.ContainsKey(key)==false)
{
    dico.Add(key,obj);
    combobox.Items.Refresh();
    combobox.SelectedItem=key;
}
// remove //
if (dico.ContainsKey(key)==true)
{
    dico.Remove(key);
    combobox.Items.Refresh();
}