【问题标题】:Add comboBox items from code behind. [WPF]从后面的代码中添加组合框项。 [WPF]
【发布时间】:2023-04-03 17:41:01
【问题描述】:

我从MSDN 获取了此代码。我试图做的是类似的,但使用一个列表而不是三个不同的字符串。这么说

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

试图做 cbox.Items.Add(strList);还尝试了一个 forloop 循环遍历每个元素,但这也不起作用。有什么想法可以实现这一目标吗?

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>

【问题讨论】:

  • 您是否尝试过将组合框的 .ItemsSource 属性设置为字符串列表?例如 cbox.ItemsSource = new list{"item1", "item2", "item3"};
  • 我有,它显示为空白。但是列表中有适量的项目。不知道发生了什么。
  • “显示为空白”是什么意思?
  • 因此,如果我将五个项目添加到列表中,则在组合框下会看到五个空插槽。生病添加一张图片,让你明白我的意思。 (在图像中:“bro”是从 xaml text="{binding field"}" 的属性带来的。我还会添加 xaml 以使事情更清楚。)组合框的内容是从列表中带来的,但它的不显示字符串文本。
  • 它是标准的 WPF 组合框,还是您为它编辑了模板?

标签: c# wpf combobox


【解决方案1】:

您可以使用数据绑定。数据绑定允许您将列表中的动态数据绑定到组合框,并使其生成并填充您正在传递的内容。

Binding WPF Combobox to a Custom List

【讨论】:

    【解决方案2】:

    以编程方式设置项目:

    代码隐藏:

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

    XAML:

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

    绑定到项目集合:

        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" />
    

    【讨论】:

    • 值得注意的是,一个列表可以用于集合,因为它在访问 get 时返回相同的数据,但我出于纯粹的习惯使用了一个可观察的集合,它内置集合更改的通知,因此组合框将更新它必然会更改的集合。
    【解决方案3】:

    如果您不想按照绑定/mvvm 模式执行此操作,只需执行以下操作即可:

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

    以后可以这样访问:

    var id = _comboBox.SelectedValue;
    

    【讨论】:

      【解决方案4】:

      我通过将我的字典 Ienumerable Keys 与 ComboBox ItemsSource 属性同步,然后在添加或删除项目时创建 Items 属性的 Refresh(),解决了在后面的代码中添加和删除 ComboBox 项目:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-19
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多