WPF AutoCompleteBox - 如何限制它只从建议列表中选择?

时间:2010-04-15 10:46:15

标签: c# xaml wpftoolkit autocompletebox

我想限制WPF AutoCompleteBox(wpf工具包控件)仅从建议列表中选择一个项目。它不应该允许用户键入他们想要的任何内容。

有人可以建议我如何实现这个吗?任何示例代码都表示赞赏。

3 个答案:

答案 0 :(得分: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);
        }            
    }
}

答案 1 :(得分:1)

您可以通过预览按键事件来限制用户。我希望它能奏效......

答案 2 :(得分:1)

如果要将其数据绑定到属性,例如

<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将等于null。 在属性的set方法中,您可以不设置该值,因为它为null,并且Property将保持其原始值。

 set
        {
            if (value != null)
            {
                BaseRecord.SiteID = value.ID;
                PropChanged("Site");
            }
        }