#wpf #mvvm #combobox #autocomplete #autosuggest
#wpf #mvvm #комбинированный блок #автозаполнение #самовнушение
Вопрос:
Когда я добавляю в combobox свойство IsEditable="True"
, оно автоматически получает поведение «Автозаполнения».
Есть ли способ добавить в это поле со списком поведение «Автоматическое предложение»?
Я имею в виду, что при записи в выпадающем списке открывается список опций с приведенной выше подписью.
(Если возможно = без уничтожения MVVM)
Ответ №1:
Вот так
Я попытался добавить автоматическое предложение типа поведения, используя стандартный выпадающий список и анимацию
<ComboBox IsEditable="True">
<ComboBoxItem>Orange</ComboBoxItem>
<ComboBoxItem>Apple</ComboBoxItem>
<ComboBoxItem>Banana</ComboBoxItem>
<ComboBoxItem>Cherry</ComboBoxItem>
<ComboBox.Triggers>
<EventTrigger RoutedEvent="TextBoxBase.TextChanged">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsDropDownOpen">
<DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ComboBox.Triggers>
</ComboBox>
Попробуйте и дайте мне знать, если это то, что вы ищете, для более сложного поведения могут потребоваться дополнительные усилия
Добавить фильтр предложений для элементов со списком
xaml
<ComboBox IsEditable="True"
ItemsSource="{Binding ComboItems}"
Text="{Binding ComboText,Mode=OneWayToSource}">
<ComboBox.Triggers>
<EventTrigger RoutedEvent="TextBoxBase.TextChanged">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsDropDownOpen">
<DiscreteBooleanKeyFrame Value="True"
KeyTime="0:0:0" />
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ComboBox.Triggers>
</ComboBox>
просмотр модели
public ICollectionView ComboItems{ get; set; }
public string ComboText
{
get
{
throw new NotImplementedException();
}
set
{
ComboItems.Filter = item => item.ToString().ToLower().Contains(value.ToLower());
}
}
возможно, вам потребуется выполнить фильтрацию на основе типов ваших элементов, приведенных выше для строковых значений
для инициализации элементов ComboItems
var myItems = new[] { "Apple", "Orange", "Cherry", "Banana" };
ComboItems = CollectionViewSource.GetDefaultView(myItems);
замените мои элементы своей коллекцией
Комментарии:
1. Я ищу автоматическое предложение, это означает, что каждый раз, когда вы добавляете текст, открывается поле со списком предложений, которые фильтруются по тексту, который вы написали.
2. итак, пересылаете ли вы также комбинированный список для фильтрации? возможно, вы можете поделиться некоторым экраном для получения более подробной информации.
3. Поскольку параметр IsEditable позволяет аналогичное поведение, поэтому IsTextSearchEnable будет избыточным для того же. это основная причина, по которой он недоступен для ComboBox. IsTextSearchEnable работает для тех элементов управления, которые не имеют встроенного текстового поля для такой цели, например, ListBox, ItemsControl и т.д.
4. Есть ли способ отменить автозаполнение?
5. здесь вы можете использовать IsTextSearchEnable и установить для него значение false, чтобы отключить автозаполнение, например IsTextSearchEnabled=»False»