正在获取所选索引WPF组合框的文本

本文关键字:组合 文本 WPF 索引 获取 | 更新日期: 2023-09-27 18:26:02

我有一个ComboBox的事件,"SelectionChange"。

以下是我要做的:

  1. 我有两个组合框
  2. 第二个组合框将根据第一个框中选定的项目显示项目
  3. ComboBox2应在选择ComboBox1上的项目后立即做出反应

我的问题是当我试图获取SelectedIndex时。

当我在确认SelectedIndex后使用ComboBox1.Text时,它会返回null,因此ComboBox2不会做出反应。

我试着放置一个按钮来强制活动,它确实起到了作用。在您释放焦点之前,SelectedIndex似乎不会改变。

以下是代码片段:

if (cb_subj.SelectedIndex == ctr)
{
     cb_section.Items.Clear();
     if (connectToDB.openConnection() == true)
     {
         MySqlDataAdapter comboBoxItems_seclist = new MySqlDataAdapter();
         MySqlCommand query = new MySqlCommand(@"SELECT section_code FROM sections 
                             WHERE subject = @subj", connectToDB.connection);
         query.Parameters.AddWithValue("@subj", cb_subj.Text);
         comboBoxItems_seclist.SelectCommand = query;

         System.Data.DataTable classlist = new System.Data.DataTable();
         comboBoxItems_seclist.Fill(classlist);
         foreach (System.Data.DataRow row in classlist.Rows)
         {
            string rows = string.Format("{0}", row.ItemArray[0]);
            cb_section.Items.Add(rows);
         }
       }
      break;
}

这是两个CB:的XAML

<ComboBox Height="23" HorizontalAlignment="Left" Margin="166,12,0,0" Name="cbox_year" VerticalAlignment="Top" Width="120" SelectionChanged="cbox_year_SelectionChanged">
        <ComboBoxItem Content="1st Year / 1st Sem" />
        <ComboBoxItem Content="1st Year / 2nd Sem" />
        <ComboBoxItem Content="2nd Year / 1st Sem" />
        <ComboBoxItem Content="2nd Year / 2nd Sem" />
        <ComboBoxItem Content="3rd Year / 1st Sem" />
        <ComboBoxItem Content="3rd Year / 2nd Sem" />
        <ComboBoxItem Content="4th Year / 1st Sem" />
        <ComboBoxItem Content="4th Year / 2nd Sem" />
    </ComboBox>
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="166,41,0,0" Name="cb_subj" VerticalAlignment="Top" Width="120" SelectionChanged="cb_subj_SelectionChanged" />

正在获取所选索引WPF组合框的文本

为了快速成功,您可以访问ComboBox1.SelectedValue或ComboBox1.SelectedItem,而不是ComboBox1-Text.

您的主要问题似乎是,当ComboBox1中的选择发生更改时,它不会直接更改ComboBox1.文本,您(即焦点)将不得不离开ComboBox 1,直到文本更新。通常,您可以通过使用数据绑定而不是这种基于事件的方法来避免此类问题。

它看起来不像是用过的绑定?我建议使用绑定,然后将绑定的UpdateSourceTrigger属性转换为UpdateSourceTriger.PropertyChanged

在底层对象中,u可以侦听属性更改事件,但一定要实现INotifyPropertyChanged。

例如,请查看http://www.tanguay.info/web/index.php?pg=codeExamples&id=304

更详细地说:

在视图中,确保设置DataContext并填充年份集合还实现了INotifyPropertyChanged

一个组合框和另一个几乎是一样的。

    private ObservableCollection<KeyValuePair<string, string>> _yearValues = new   ObservableCollection<KeyValuePair<string, string>>();
    public ObservableCollection<KeyValuePair<string, string>> YearValues
    {
        get
        {
            return _yearValues;
        }
        set
        {
            _yearDownValues = value;
            OnPropertyChanged("YearValues");
        }
    }
    private string _selectedYear;
    public string SelectedYear
    {
        get
        {
            return _selectedYear;
        }
        set
        {
            _selectedYear = value;
            OnPropertyChanged("SelectedYear");
        }
    }

请确保挂接OnPropertyChanged并执行

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (propertyName == "SelectedYear")
        {
            // populate subj collection which will update the combobox
        }
    }

在您的xaml:中

<ComboBox Name="YearCombobox" 
        ItemsSource="{Binding YearValues}"
        SelectedValue="{Binding SelectedYear}"
        SelectedValuePath="Key"
        DisplayMemberPath="Value"/>
<ComboBox Name="SubjCombobox" 
        ItemsSource="{Binding SubjValues}"
        SelectedValue="{Binding SelectedSubj}"
        SelectedValuePath="Key"
        DisplayMemberPath="Value"/>

你试过吗

e.AddedItems[0]

如果您不使用MVVM(通常应该使用),SelectionChanged有时会变为null。选择这个而不是其他。

尝试

var selectionItem = e.AddedItems[0] as ComboBoxItem;
string text = selectionItem.Content.ToString();

e.RemovedItems也可以用于获取以前选择的项。