【问题标题】:ComboBox Text Gets Highlighted & Erased Whenever ItemsSource Changes每当 ItemsSource 更改时,ComboBox 文本都会突出显示并删除
【发布时间】:2017-03-07 15:09:38
【问题描述】:

我在 WPF 应用程序中使用组合框,这样在组合框中键入 3 个字符后,它会查询 SQL 以生成数据表,然后在将组合框转换为列表后,该表将为我的组合框提供 ItemsSource。当用户在我的组合框中键入超过 3 个字符时,我正在使用 LINQ 进一步过滤该列表。但是,每当更新项目源时,组合框中的文本就会突出显示,并且正在键入的用户将删除所有内容并从 1 个字符开始,正如您突出显示文本并开始键入时所预期的那样。这是我指的错误:

(对不起,值被掩盖了,因为它是私人信息)

所以,如您所见,我的组合框有它的“ItemsSource”,但它已被更新。但是,我在组合框中输入的下一个字母将被覆盖,因为我输入的内容“ANDE”正在寻找匹配并自动突出显示,蓝色突出显示在“1979 年 11 月 2 日”之上。有没有办法关闭这个建议部分?

这是我的 XAML,如果有用的话,还有我更新的 itemSource 代码:

XAML

<ComboBox x:Name="patientComboBox" 
    Text="" HorizontalAlignment="Left" 
    Margin="21,36,0,0" VerticalAlignment="Top"
    Width="269" IsEditable="True
    KeyDown="patientComboBox_KeyDown"
    DropDownClosed="patientComboBox_DropDownClosed"/>

ComboBox_KeyDown

 private async void patientComboBox_KeyDown(object sender, KeyEventArgs e)
    {
        if (patientComboBox.Text.Length < 3)
        {
            PublicVars.data = new System.Data.DataTable();
        }
        else
        {
            PublicVars.patientSearchText = patientComboBox.Text;
            PublicVars.searchComplete = false;
            PublicVars.currentNameSearch = patientComboBox.Text;
            //Dont write over the thread if it is currently running
            if (!worker.IsBusy)
                await Task.Run(() => worker.RunWorkerAsync());
            //wait for the async to run to continue
            check:
            if (PublicVars.currentNames != null && PublicVars.searchComplete == true)
                patientComboBox.ItemsSource = PublicVars.currentNames;
            else
            {
                goto check;
            }                
            patientComboBox.IsDropDownOpen = true;
        }
    }

Background_Worker_DoWork

private async void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
        if (PublicVars.data.Rows.Count != 0)
        {
            PublicVars.currentNames = new List<string>();
            await Task.Run(() => PublicVars.filterList = PublicVars.data.AsEnumerable().Where(x => x["LastName"].ToString() == PublicVars.patientSearchText).ToList());      
            foreach(DataRow row in PublicVars.filterList)
            {
                PublicVars.currentNames.Add(row["LastName"].ToString() + ", " + row["FirstName"].ToString() + " -- " + row["DOB"].ToString());
            }

            PublicVars.searchComplete = true;
        }
        else
        {
            PublicVars.topPatients = new List<NameSearchObj>();
            PublicVars.currentNames = new List<string>();
            SqlConnection cnn = new SqlConnection("...");
            string sqlCommand = "...";
            cnn.Open();
            System.Data.DataSet ds = new System.Data.DataSet();
            System.Data.DataTable dtable = new System.Data.DataTable();
            SqlDataAdapter dscmd = new SqlDataAdapter(sqlCommand, cnn);
            dscmd.Fill(dtable);

            foreach (System.Data.DataRow row in dtable.Rows)
            {
                PublicVars.topPatients.Add(new NameSearchObj(row["LastName"].ToString() + ", " + row["FirstName"].ToString() + " -- " + row["DOB"].ToString(), row["PtKey"].ToString()));
            }

            foreach (NameSearchObj searcher in PublicVars.topPatients)
            {
                string[] convertName = searcher._nameDOBCombo.Split(' ');
                string finalName = convertName[0] + " " + convertName[1] + " " + convertName[2] + " " + convertName[3];
                PublicVars.currentNames.Add(finalName);
            }

            PublicVars.data = dtable;
            PublicVars.searchComplete = true;
        }            
    }

【问题讨论】:

    标签: c# wpf xaml combobox


    【解决方案1】:

    我通过使用文本框解决了我的问题,就好像它是一个“搜索框”,用户可以在其中输入搜索条件,这将调整它旁边的 Combobox 的 itemsSource。对解决方案不满意,但它现在完成了任务。

    【讨论】:

      【解决方案2】:

      我没有用你的代码尝试过,但我认为你可以设置 TextSearch.TextPath="dummy" 或任何其他不是下拉列表中对象属性名称的值。

      【讨论】:

        猜你喜欢
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 2021-09-26
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        相关资源
        最近更新 更多