【发布时间】: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;
}
}
【问题讨论】: