Pergunta

Gostaria de restringir o WPF AutoCompleteBox (WPF Toolkit Control) para selecionar um item apenas na lista de sugestões. Não deve permitir que os usuários digam o que quiserem.

Alguém pode me sugerir como implementar isso? Qualquer código de amostra é apreciado.

Foi útil?

Solução

Eis como eu fiz isso. Crie uma classe derivada e substitua onpreviewTextInput. Defina sua coleção para a propriedade Itens Source do controle e ela deve funcionar bem.

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);
        }            
    }
}

Outras dicas

Você pode restringir o usuário do PRESTIEW KEY Down. Espero que funcione...

Se você estiver no banco de dados em uma propriedade, como este para um exemplo

<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>

Se algum texto for inserido, o que não corresponde a nada no itens Source, o SelectedItem será igual a NULL. No método definido da sua propriedade, você não pode definir o valor porque é nulo e a propriedade manterá seu valor original.

 set
        {
            if (value != null)
            {
                BaseRecord.SiteID = value.ID;
                PropChanged("Site");
            }
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top