Я пытаюсь создать поле поиска, используя AutoCompleteBox
из набора инструментов WPF. Свойство Text элемента AutoCompleteBox привязано к свойству в ViewModel
, которое реализует INotifyPropertyChanged
. Когда свойство изменяется, оно извлекает новые предложения для показа пользователю.
Это испортится, если пользователь использует клавиши со стрелками для просмотра списка предложений автозаполнения, прежде чем выбрать одно — в момент перемещения курсора во всплывающее окно срабатывает SelectionChanged
, текстовое поле получает новое значение, а предложения автозаполнения повторяются. собрал. Это также мешает моему желанию использовать событие SelectionChanged
для начала поиска.
Есть ли способ предотвратить запуск события SelectionChanged при навигации с помощью клавиатуры?
Вот как у меня все устроено. Примечание. sc:SearchField
является подклассом AutoCompleteBox
, который предоставляет только способ доступа к свойству TextBox
в AutoCompleteBox
, поэтому я могу вызывать такие функции, как SelectAll()
.
XAML:
<sc:SearchField x:Name="SearchField" DataContext="{Binding SearchBoxVm}" Text="{Binding Query, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding QuerySuggestions, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" IsTextCompletionEnabled="False" Margin="54,10,117,67" Grid.RowSpan="2" BorderThickness="0" FontSize="14" PreviewKeyUp="searchField_OnKeyup" Foreground="{Binding Foreground, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" FontStyle="{Binding QueryFont, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
</sc:SearchField>
ViewModel:
void GetQuerySuggestions()
{
if (!string.IsNullOrEmpty(Query) && !Query.Equals(DEFAULT_TEXT))
{
QueryFont = FontStyles.Normal;
Foreground = Brushes.Black;
QuerySuggestions = SearchAssistant.GetQueryRecommendations(_query);
}
}
public string _query = DEFAULT_TEXT;
public string Query
{
get
{
return _query;
}
set
{
_query = value;
GetQuerySuggestions();
NotifyPropertyChanged("Query");
}
}
List<string> querySuggestions = new List<string>();
public List<string> QuerySuggestions
{
get { return querySuggestions; }
set
{
querySuggestions = value;
NotifyPropertyChanged("QuerySuggestions");
}
}
Подкласс SearchField:
public class SearchField : AutoCompleteBox
{
public TextBox TextBox
{
get
{
return (this.GetTemplateChild("Text") as TextBox);
}
}
}