2009-11-25 10 views
45

डब्ल्यूपीएफ Binding.Mode में, Default का चयन करते समय, यह संपत्ति को बाध्य करने पर निर्भर करता है।बाध्यकारी के लिए डिफ़ॉल्ट क्या हैं। मोड = WPF नियंत्रण के लिए डिफ़ॉल्ट?

मैं कुछ सूची या कुछ सम्मेलन या विभिन्न नियंत्रणों के लिए डिफ़ॉल्ट के लिए किसी भी जानकारी की तलाश में हूं।
मेरा मतलब है, डिफ़ॉल्ट रूप से TwoWay कौन से गुण हैं और इसी तरह। किसी भी लिंक, विचार, विचार और यहां तक ​​कि rants का स्वागत है!

उत्तर

48

UpdateSourceTrigger के समान, मोड संपत्ति के लिए डिफ़ॉल्ट मान प्रत्येक प्रॉपर्टी के लिए भिन्न होता है। उपयोगकर्ता संपादन योग्य गुण जैसे TextBox.Text, ComboBox.Text, MenuItem.IsChecked, आदि, TwoWay उनके डिफ़ॉल्ट मोड मूल्य के रूप में की है। को डिफ़ॉल्ट करने के लिए यदि TwoWay डिफ़ॉल्ट है, तो निर्भरता संपत्ति जानकारी संपत्ति के अनुभाग देखें। यदि यह BindsTwoWayByDefault सत्य पर सेट है, तो संपत्ति का डिफ़ॉल्ट मोड मान TwoWay है। यह प्रोग्राम के रूप में करने के लिए, GetMetadata फोन करके संपत्ति की संपत्ति मेटाडाटा और फिर BindsTwoWayByDefault संपत्ति का बूलियन मूल्य की जाँच करें।

स्रोत: http://blogs.msdn.com/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

सबसे सुरक्षित तरीका हमेशा स्पष्ट होना करने के लिए क्या बाध्यकारी मोड की तरह आप एक बंधन से चाहते हो जाएगा।

+2

क्या कोई ऐसी जगह है जहां मुझे सभी गुणों और उनके बाइंडिंग मोड की सूची मिल सकती है? नियम क्या हैं? – Shimmy

+0

संपत्तियों की सूची अंतहीन है। मुझे लगता है कि http://msdn.microsoft.com माइक्रोसॉफ्ट के अधिकांश लोगों की सूची है। मुझे कोई जानकारी और बाध्यकारी मोड नहीं दिख रहा है, इसलिए मुझे लगता है कि आपको इसे स्वयं से ढूंढना होगा। मेरे उत्तर में मैंने जो यूआरएल दिया है, उसे बताता है कि उन्हें कैसे ढूंढें –

+3

निर्भरता गुणों के बारे में क्या है जिनके मेटाडेटा फ्रेमवर्कप्रॉपर्टी मेटाडेटा के बजाय यूआईपीप्रर्टी मेटाडाटा हैं? इस तरह के गुणों के लिए एमएसडीएन दस्तावेज़ों में BindsTwoWayByDefault का उल्लेख नहीं है क्योंकि यह बूलियन UIPropertyMetadata पर मौजूद नहीं है। – HappyNomad

8

यहाँ एक डी पी द्वारा समर्थित डिफ़ॉल्ट मोड खोजने के लिए एक तरीका है -

नेट परावर्तक अपने दोस्त है। परावर्तक के साथ, TextBox और के लिए खोज स्थिर निर्माता (.cctor()) के स्रोत को देखें।

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 यहाँ, आप TextProperty डीपी पंजीकरण के लिए इस्तेमाल किया कोड को खोजने के लिए सक्षम हो जाएगा। यदि आप टेक्स्टबॉक के टेक्स्ट डीपी के पंजीकरण को देखने के लिए परावर्तक का उपयोग करते हैं, तो आप देखेंगे कि ऐसा कोई मान पास नहीं हुआ है, इस मामले में हम बाध्यकारी डिफ़ॉल्ट रूप से एक तरीका मानते हैं।

बिया Stollnitz पद से लिया: How can I update an explicit binding within a template?

हालांकि महत्वपूर्ण डीपी की सूची में किसी तरह का होने बहुत मददगार होगा।

0

एक सूची की तलाश में था, ज्यादातर यह पता लगाने के लिए कि किस बाइंडिंग को प्रदर्शन में सुधार के लिए एक तरफ सेट किया जा सकता है।निम्नलिखित कार्य आप पाते हैं जो डिफ़ॉल्ट रूप से दो तरह से बाध्यकारी का उपयोग को नियंत्रित करता है मदद कर सकते हैं:

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 

दिलचस्प बात यह है कि अधिकांश नियंत्रणों में टेक्स्टशर्च प्रॉपर्टी होती है जिसमें दो-तरफा बाध्यकारी होता है।

संबंधित मुद्दे