0

如何让我的可编辑组合框接受和保留用户输入,同时动态更新组合框中可用的选项?

我想要完成的是允许用户开始输入查询,并根据迄今为止输入的内容显示查询建议。获取建议和更新组合框的内容进展顺利,但在每次更新时,输入都会被删除并替换为更新列表中的第一个条目。

到目前为止,这是我尝试过的(以及其他没有完全成功的类似 SO 建议)

<ComboBox x:Name="cmboSearchField" Margin="197,10,0,0" 
 VerticalAlignment="Top" Width="310" IsTextSearchEnabled="True" 
 IsEditable="True" ItemsSource="{Binding SearchTopics}" 
 KeyUp="GetSearchTopics"/>

而我背后的代码:

public ObservableCollection<string> SearchTopics {get;set;}

void GetSearchTopics(object sender, KeyEventArgs e)
{
   bool showDropdown = this.cmboSearchField.IsDropDownOpen;

   if ((e.Key >= Key.D0) && (e.Key <= Key.Z))
   {
      query = this.cmboSearchField.Text;

      List<string> topics = GetQueryRecommendations(query);

      _searchTopics.Clear();

      _searchTopics.Add(query); //add the query back to the top

      //stuffing the list into a new ObservableCollection always
      //rendered empty when the dropdown was open          
      foreach (string topic in topics)
      {
         _searchTopics.Add(topic);
      }

      this.cmboSearchField.SelectedItem = query; //set the query as the current selected item

      //this.cmboSearchField.Text = query; //this didn't work either   

      showDropdown = true;
   }


   this.cmboSearchField.IsDropDownOpen = showDropdown;
}
4

2 回答 2

0

你不应该清除 observablecollection。

如果您清除集合,那么在某些时候列表是空的并且对所选项目的引用丢失。

相反,只需查看哪些项目已经在其中,然后只添加尚不可用的项目。

于 2013-04-30T21:01:03.853 回答
0

事实证明,更新ObservableCollection与我看到的行为无关。后来我意识到它的行为就像打字是在搜索下拉集合中的匹配条目,从而替换用户每次提供的任何输入。

这正是正在发生的事情。IsTexSearchEnabled在窗口 XAML中将元素的属性设置ComboBox为 false 解决了该问题。

<ComboBox x:Name="cmboSearchField" Margin="218,10,43,0" 
 IsTextSearchEnabled="false" VerticalAlignment="Top" 
 IsEditable="True" ItemsSource="{Binding SearchTopics}" 
 KeyUp="GetSearchTopics"/>
于 2013-05-01T17:13:26.917 回答