ما هي الإعدادات الافتراضية لـ binding.mode = الافتراضي لعناصر التحكم في WPF؟

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

سؤال

في WPF Binding.Mode, ، عند الاختيار تقصير, ، يعتمد ذلك في الممتلكات التي تعاني من ذلك.

أبحث عن بعض القائمة أو بعض المؤتمرات أو أي معلومات عن الإعدادات الافتراضية لعناصر التحكم المختلفة.
أعني ، ما هي الخصائص TwoWay بشكل افتراضي وهلم جرا. أي روابط وأفكار وأفكار وحتى التشدقات هي welcommed!

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

المحلول

على غرار UpdateSourCetrigger ، تختلف القيمة الافتراضية لخاصية الوضع لكل خاصية. خصائص قابلة للتحرير مثل TextBox.Text, ComboBox.Text, MenuItem.IsChecked, ، إلخ ، لديك TwoWayكقيمة الوضع الافتراضي. لمعرفة ما إذا كان الافتراضي TwoWay, ، انظر إلى قسم معلومات خاصية التبعية في العقار. إذا كان يقول BindsTwoWayByDefault تم تعيينه على صحيح ، ثم قيمة الوضع الافتراضي للخاصية TwoWay. للقيام بذلك برمجيا ، احصل على بيانات تعريف العقار عن طريق الاتصال GetMetadata ثم تحقق من القيمة المنطقية لـ BindsTwoWayByDefaultمنشأه.

مصدر: https://web.archive.org/web/20100209025938/http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

تتمثل الطريقة الأكثر أمانًا في أن تكون صريحًا دائمًا نوع وضع الربط الذي تريده من الربط.

نصائح أخرى

فيما يلي طريقة للعثور على الوضع الافتراضي الذي يدعمه DP -

.NET Reflector هو صديقك. مع العاكس ، ابحث عن TextBox وانظر إلى مصدر المنشئ الثابت (.cctor()). هنا ، ستتمكن من العثور على الرمز المستخدم لتسجيل TextPropertyDP:

TextProperty = DependencyProperty.Register
               (
                   "Text", 
                   typeof(string), 
                   typeof(TextBox), 
                   new FrameworkPropertyMetadata
                   (
                      string.Empty, 
                      FrameworkPropertyMetadataOptions.Journal |
                      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
                      new PropertyChangedCallback(TextBox.OnTextPropertyChanged), 
                      new CoerceValueCallback(TextBox.CoerceText), 
                      true, 
                      UpdateSourceTrigger.LostFocus
                   )
                );

لاحظ أنه يتم تمرير المعلمة إلى طريقة التسجيل التي تشير إلى وضع الربط الافتراضي: FrameworkPropertyMetadataOptions.BindsTwoWayByDefault. إذا كنت تستخدم Reflector للنظر في التسجيل لنص TextBlock DP ، فسترى أنه لا يتم تمرير مثل هذه القيمة ، وفي هذه الحالة نفترض أن الربط هو طريقة واحدة بشكل افتراضي.

مأخوذة من وظيفة Bea Stollnitz: كيف يمكنني تحديث الربط الصريح داخل قالب؟

على الرغم من أن وجود نوع من قائمة موانئ دبي الهامة سيكون مفيدًا للغاية.

كان يبحث عن قائمة أيضًا ، معظمها لمعرفة الروابط التي يمكن ضبطها على اتجاه واحد لتحسين الأداء. يمكن أن تساعدك الوظائف التالية في العثور على عناصر التحكم التي تستخدم الربط ثنائي الاتجاه افتراضيًا:

public IList<DependencyProperty> GetAttachedProperties(DependencyObject obj)
{
    var result = new List<DependencyProperty>();
    foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(obj, new Attribute[] { new PropertyFilterAttribute(PropertyFilterOptions.Valid) }))
    {
        var dpd = DependencyPropertyDescriptor.FromProperty(pd);
        if (dpd != null)
        {
            result.Add(dpd.DependencyProperty);
        }
    }
    return result;
}

public bool IsBindsTwoWayByDefault(DependencyObject obj, DependencyProperty property)
{
    var metadata = property.GetMetadata(obj) as FrameworkPropertyMetadata;
    if (metadata != null)
    {
        return metadata.BindsTwoWayByDefault;
    }
    return false;
}

باستخدام وظيفة طباعة ، يعطينا قائمة:

var objList = new List<DependencyObject> { new TextBox(), new TextBlock(), new Label(), new ComboBox(), new Button() };
foreach (var obj in objList)
{
    var props = GetAttachedProperties(obj);
    foreach (var prop in props)
    {
        if(IsBindsTwoWayByDefault(obj, prop))
            Debug.WriteLine($"{obj} : {prop.OwnerType}:{prop.Name}");
    }
}

نتيجة عينة (خصائص التحكم مع ربط ثنائي الاتجاه باعتباره افتراضيًا)

System.Windows.Controls.TextBox : System.Windows.Controls.TextBox:Text
System.Windows.Controls.TextBox : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.TextBlock : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.Label : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.ComboBox:IsDropDownOpen
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.ComboBox:Text
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedIndex
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedItem
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.Primitives.Selector:SelectedValue
System.Windows.Controls.ComboBox Items.Count:0 : System.Windows.Controls.TextSearch:Text
System.Windows.Controls.Button : System.Windows.Controls.TextSearch:Text

ومن المثير للاهتمام ، أن معظم الضوابط لديها خاصية Extstsearch التي لها ملزمة في اتجاهين.

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