ما هي الإعدادات الافتراضية لـ binding.mode = الافتراضي لعناصر التحكم في WPF؟
-
22-09-2019 - |
سؤال
في WPF Binding.Mode
, ، عند الاختيار تقصير, ، يعتمد ذلك في الممتلكات التي تعاني من ذلك.
أبحث عن بعض القائمة أو بعض المؤتمرات أو أي معلومات عن الإعدادات الافتراضية لعناصر التحكم المختلفة.
أعني ، ما هي الخصائص TwoWay
بشكل افتراضي وهلم جرا. أي روابط وأفكار وأفكار وحتى التشدقات هي welcommed!
المحلول
على غرار UpdateSourCetrigger ، تختلف القيمة الافتراضية لخاصية الوضع لكل خاصية. خصائص قابلة للتحرير مثل
TextBox.Text
,ComboBox.Text
,MenuItem.IsChecked
, ، إلخ ، لديكTwoWay
كقيمة الوضع الافتراضي. لمعرفة ما إذا كان الافتراضيTwoWay
, ، انظر إلى قسم معلومات خاصية التبعية في العقار. إذا كان يقولBindsTwoWayByDefault
تم تعيينه على صحيح ، ثم قيمة الوضع الافتراضي للخاصيةTwoWay
. للقيام بذلك برمجيا ، احصل على بيانات تعريف العقار عن طريق الاتصالGetMetadata
ثم تحقق من القيمة المنطقية لـBindsTwoWayByDefault
منشأه.
تتمثل الطريقة الأكثر أمانًا في أن تكون صريحًا دائمًا نوع وضع الربط الذي تريده من الربط.
نصائح أخرى
فيما يلي طريقة للعثور على الوضع الافتراضي الذي يدعمه DP -
.NET Reflector هو صديقك. مع العاكس ، ابحث عن
TextBox
وانظر إلى مصدر المنشئ الثابت (.cctor()
). هنا ، ستتمكن من العثور على الرمز المستخدم لتسجيلTextProperty
DP: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 التي لها ملزمة في اتجاهين.