WPF AutoCompletebox - كيفية تقييدها فقط اختيار من قائمة الاقتراحات؟

StackOverflow https://stackoverflow.com/questions/2644540

سؤال

أرغب في تقييد WPF CompleteBox (التحكم في مجموعة أدوات WPF) لتحديد عنصر فقط من قائمة الاقتراحات. يجب ألا يسمح للمستخدمين بكتابة ما يريدون.

هل يمكن لأحد أن يقترح علي كيفية تنفيذ هذا؟ أي رمز عينة هو موضع تقدير.

هل كانت مفيدة؟

المحلول

إليكم كيف فعلت ذلك. إنشاء فئة مشتقة وتجاوز onPreviewTextInput. قم بتعيين مجموعتك على خاصية Control الخاصة بـ Controls Sectource ويجب أن تعمل بشكل جيد.

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

نصائح أخرى

يمكنك تقييد المستخدم حسب حدث Key Down. آمل ان يعمل...

إذا كنت تقوم بتجميعها إلى خاصية ، مثل هذا على سبيل المثال

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

إذا تم إدخال بعض النصوص التي لا تتطابق مع أي شيء في Selecsource ، فسيكون SelectItem مساويًا لـ NULL. في الطريقة المحددة للممتلكات الخاصة بك ، لا يمكنك فقط تعيين القيمة لأنها فارغة ، وسيحتفظ العقار بقيمة أصلية.

 set
        {
            if (value != null)
            {
                BaseRecord.SiteID = value.ID;
                PropChanged("Site");
            }
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top