WPF可编辑组合框 - 更新可观察列表时保留输入

时间:2013-04-30 20:48:15

标签: c# .net wpf combobox observablecollection

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

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

这是我到目前为止所尝试的内容(以及其他类似的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;
}

2 个答案:

答案 0 :(得分:0)

你不应该清除observablecollection。

如果您清除了该集合,那么在某些时候该列表为空并且对该选定项的引用将丢失。

相反,只需查看哪些项目已经存在,只添加尚未提供的项目。

答案 1 :(得分:0)

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

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

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