WPF AutoCompleteBox - Как его ограничить, выбирайте только из списка предложений?
Я хотел бы ограничить WPF AutoCompleteBox (элемент управления wpf), чтобы выбрать элемент только из списка предложений. Он не должен позволять пользователям вводить то, что они хотят.
Может кто-нибудь подсказать, как это реализовать? Любой пример кода приветствуется.
3 ответа
Вот как я это сделал. Создайте производный класс и переопределите OnPreviewTextInput. Установите для вашей коллекции свойство ItemsSource элемента управления, и оно должно работать хорошо.
public class CurrencySelectorTextBox : AutoCompleteBox
{
protected override void OnPreviewTextInput(TextCompositionEventArgs e)
{
var currencies = this.ItemsSource as IEnumerable<string>;
if (currencies == null)
{
return;
}
if (!currencies.Any(x => x.StartsWith(this.Text + e.Text, true, CultureInfo.CurrentCulture))
{
e.Handled = true;
}
else
{
base.OnPreviewTextInput(e);
}
}
}
Вы можете ограничить пользователя по событию нажатия клавиши Priview. Я надеюсь, что это будет работать...
Если вы привязываете его к свойству, например, для примера
<sdk:AutoCompleteBox ItemsSource="{Binding Sites, Source={StaticResource VmSchedulel}}" ValueMemberPath="SiteName"
SelectedItem="{Binding Site, Mode=TwoWay}" FilterMode="ContainsOrdinal">
<sdk:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding SiteName}"/>
</DataTemplate>
</sdk:AutoCompleteBox.ItemTemplate>
</sdk:AutoCompleteBox>
Если будет введен какой-то текст, который не соответствует чему-либо в ItemsSource, SelectedItem будет равен нулю. В методе set вашего свойства вы можете просто не устанавливать значение, потому что оно равно null, и свойство будет сохранять свое первоначальное значение.
set
{
if (value != null)
{
BaseRecord.SiteID = value.ID;
PropChanged("Site");
}
}