WPF AutoCompleteBox - Как ограничить его выбор только из списка предложений? - PullRequest
6 голосов
/ 15 апреля 2010

Я хотел бы ограничить WPF AutoCompleteBox (элемент управления wpf toolkit), чтобы выбрать элемент только из списка предложений. Он не должен позволять пользователям вводить то, что они хотят.

Может кто-нибудь подсказать мне, как это реализовать? Любой пример кода приветствуется.

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

Вот как я это сделал. Создайте производный класс и переопределите 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);
        }            
    }
}
1 голос
/ 13 октября 2010

Если вы привязываете его к свойству, например, для примера

<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");
            }
        }
1 голос
/ 23 мая 2010

Вы можете ограничить пользователя событием нажатия клавиши Priview. Я надеюсь, что это будет работать ...

...