عدد مربع تحرير وسرد Silverlight للعناصر المعروضة للتحديث

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

سؤال

لدي مربعي تحرير وسرد في صفحة SL.عند تحديث Combo 1، يتم استدعاء خدمة وملء Combo 2.

في المكالمة الأولى، يتم إرجاع 3 نتائج.عندما يتم توسيع مربع التحرير والسرد، يمكنك رؤية كافة الخيارات الثلاثة.

في المكالمة الثانية، يتم إرجاع 4 نتائج.عندما يتم توسيع مربع التحرير والسرد، يمكنك رؤية 3 خيارات، مع شريط تمرير عمودي.

إذا قمت بإعادة التحميل وقمت بهذه الخطوات في الاتجاه المعاكس، سأحصل على 4 صفوف في المكالمة الأولى و3 صفوف + صف فارغ في المكالمة الثانية.(لا، ​​الفراغ ليس سجلاً.لا يمكن تحديده.)

يبدو أن حجم القائمة المنسدلة يحافظ على الارتفاع الأول الذي تم إنشاؤه.

كيف يمكنني تحديث الحد الأقصى لعناصر مربع التحرير والسرد المعروض بعد كل مكالمة خدمة؟

شكرًا!

تحرير رقم 1

يتبع الكود نمط M-V-VM.عند تحميل الصفحة، Group1 يملأ مربع التحرير والسرد الأول، ولا يتم تحديد أي شيء.عندما يقوم المستخدم بإجراء تحديد، يرتبط هذا التحديد بـ Group1Selection.

<ComboBox ItemsSource="{Binding Path=Group1}" SelectedItem="{Binding Path=Group1Selection}" />
<ComboBox ItemsSource="{Binding Path=Group2}" SelectedItem="{Binding Path=Group2Selection}" />

في نموذج العرض، في مجموعة الملحقات الخاصة بـ Group1Selection الملكية، لدي شيء من هذا القبيل

set
{
    if (group1Selection != value)
    {
        group1Selection = value;
        PopulateGroup2();
        OnPropertyChanged("Group1Selection");
    }
}

حيث يقوم PopulateGroup2 بإجراء مزامنة استدعاء الخدمة الخاصة بي، ويحصل على البيانات، ويضع تلك البيانات في الخاصية المكشوفة لـ Group2.

في ظل الظروف "العادية"، لا يمثل هذا مشكلة، نظرًا لأن معظم الخيارات تحتوي على عشرات الاختيارات الممكنة.ومع ذلك، اثنين من Group1 تحتوي الاختيارات على 3 أو 4 اختيارات للأطفال فقط.إذا تم تحديد أحد هذه العناصر أولاً، فسيتم تعيين ارتفاع ComboBox لبقية مثيل التطبيق هذا على 3 أو 4، على التوالي، بدلاً من الوصول إلى الحد الأقصى عند 8 عناصر معروضة.

باتباع نمط M-V-VM، لا يوجد رمز في الكود الخلفي.

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

المحلول

هذا خطأ معروف في ComboBox في Silverlight 2.أعتقد أنه تم إصلاحه في SL 3.

يمكنك إصلاح ذلك عن طريق القيام بما يلي:

  1. ترث من ComboBox

    الفئة العامة MyComboBox:صندوق التحرير

  2. احصل على مرجع للجزء "المنبثق" من ComboBox داخل طريقة OnApplyTemplate()

        Popup thePopup = GetTemplateChild("Popup") as Popup;
        FrameworkElement thePopupContent = thePopup.Child as FrameworkElement;
    
  3. تجاوز الأسلوب OnItemsChanged

  4. داخل طريقة OnItemsChagned التي تم تجاوزها، قم بإعادة تعيين خصائص تبعية الارتفاع والعرض على النافذة المنبثقة باستخدام طريقة ClearValue(DP).

            thePopupContent.ClearValue(FrameworkElement.WidthProperty);
            thePopupContent.ClearValue(FrameworkElement.HeightProperty);
    

يمكنك مسح خصائص Max وMin Height & Width إذا كنت قلقًا بشأنها أيضًا.

نصائح أخرى

وكان هذا الحل الأمثل.شكرا لك ماركتي.

بالنسبة للمهتمين، سيبدو الفصل كما يلي:

using System.Windows.Controls.Primitives; 

public class WorkAroundComboBox: ComboBox
{
    FrameworkElement thePopupContent;

    public override void OnApplyTemplate()
    {
        Popup thePopup = GetTemplateChild("Popup") as Popup;
        thePopupContent = thePopup.Child as FrameworkElement;
        base.OnApplyTemplate();
    }

    protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        thePopupContent.ClearValue(FrameworkElement.WidthProperty);
        thePopupContent.ClearValue(FrameworkElement.HeightProperty);
        base.OnItemsChanged(e);
    }
}

}

أعتقد أن المشكلة تكمن في أن Silverlight لا يدرك تمامًا أن البيانات الموجودة خلف ComboBox 2 قد تغيرت.ربما حاول إضافة OnPropertyChanged("Group2") إلى المجموعة ل Group1 - من المفترض أن يساعد ذلك Silverlight على إدراك أنه يحتاج إلى تحديث الارتباطات الخاصة بـ ComboBox 2.

قد يكون من المفيد أيضًا الاتصال OnPropertyChanged ل Group2Selection, ، لأن القيمة السابقة لم تعد صالحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top