在组合框中添加新元素,下拉列表未更新

本文关键字:元素 下拉列表 更新 组合 添加 新元素 | 更新日期: 2023-09-27 17:56:49

我正在根据代码隐藏绑定ComboBox,下面是我的XAML和代码隐藏:

<Window x:Class="ComboBoxBindingDatabase.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ComboBox Height="29" HorizontalAlignment="Left" Margin="135,60,0,0" Name="comboBox1" VerticalAlignment="Top" Width="194" IsEditable="True"/>
    <TextBox Height="39" HorizontalAlignment="Left" Margin="135,159,0,0" Name="textBox1" VerticalAlignment="Top" Width="194" />
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="384,165,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <TextBox Height="35" HorizontalAlignment="Left" Margin="368,0,0,172" Name="textBox2" VerticalAlignment="Bottom" Width="115" />
</Grid>

和代码后面:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        BindComboBox(comboBox1);
    }
    ArrayList b = new ArrayList();
    public void BindComboBox(ComboBox comboBoxName)
    {
        b.Add("a");
        b.Add("b");
        b.Add("c");
        b.Add("d");
        comboBoxName.ItemsSource = b;  
        comboBoxName.DisplayMemberPath = Name;
        comboBoxName.SelectedValuePath = Name;
    }
    private void button1_Click(object sender, RoutedEventArgs e)
    {
        b.Add(textBox2.Text);
        foreach (string s in b)
        {
            comboBox1.ItemsSource = b;
            comboBox1.DisplayMemberPath = Name;
            comboBox1.SelectedValuePath = Name;
        }
    }
}

因此,当我第一次运行该项目时,ComcoBox 显示 a,b,c d 作为下拉列表。但是当我在文本框中输入一些新字母并单击按钮时,ArrayList b 确实将新字母添加到列表中,并且我正在尝试重新绑定组合框,但它不起作用。它仍然显示a,b,c,d认为我看到ArrarList b做增量。

为什么组合框不重新绑定?无论如何,是否可以基于代码隐藏将元素动态添加到ComboBox中,而不仅仅是简单的item.add方法。

提前谢谢。

在组合框中添加新元素,下拉列表未更新

您应该改用可观察集合。 而且您不必在按钮单击中再次绑定,即使每当添加新项目并且组合框将更新时,集合也会触发更改通知。

  ObservableCollection<string> b= new ObservableCollection<string>();
  public void BindComboBox(ComboBox comboBoxName)
    {
        b.Add("a");
        b.Add("b");
        b.Add("c");
        b.Add("d");
        comboBoxName.ItemsSource = b;  

    }

 private void button1_Click(object sender, RoutedEventArgs e)
    {
        b.Add(textBox2.Text);
    }

在 WPF 中,在代码隐藏中直接引用 UIControls 是一种不好的做法。控件应绑定到数据,更改数据时应更新 UI。

这里有一个小例子,说明你想用更少的对 UIControls 的引用来做什么

Xaml:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="233" Width="405" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <StackPanel>
            <ComboBox ItemsSource="{Binding MyList}" Name="comboBox1" IsEditable="True"/>
            <TextBox x:Name="textbox1" />
            <Button Content="Button" Tag="{Binding ElementName=textbox1, Path=Text}" Name="button1" Click="button1_Click" />
        </StackPanel>
    </Grid>
</Window>

法典:

  public partial class MainWindow : Window
    {
        private ObservableCollection<string> _myList = new ObservableCollection<string>();
        public MainWindow()
        {
            InitializeComponent();
            MyList.Add("a");
            MyList.Add("b");
            MyList.Add("c");
            MyList.Add("d");
        }
        public ObservableCollection<string> MyList
        {
            get { return _myList; }
            set { _myList = value; }
        }
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            MyList.Add((sender as Button).Tag.ToString());
        }
     }