2010-04-28 9 views
5

नहीं है मेरे पास मेरे कस्टम टेक्स्टबॉक्स पर एक अंतर निर्भरता संपत्ति है, जिसमें बैकिंग मान है। यह एक int के लिए बाध्य है? DataContext पर संपत्ति।डब्ल्यूपीएफ निर्भरता प्रॉपर्टी सेटर फ़ायरिंग नहीं कर रहा है जब PropertyChanged निकाल दिया गया है, लेकिन स्रोत मान

यदि मैं अपने डेटा कॉन्टेक्स्ट में प्रॉपर्टी चेंज इवेंट बढ़ाता हूं, और स्रोत प्रॉपर्टी का मान नहीं बदला जाता है (शून्य रहता है), तो निर्भरता प्रॉपर्टी के सेटर को निकाल दिया नहीं जाता है।

यह एक समस्या है, क्योंकि मैं प्रॉपर्टी चेंज पर कस्टम टेक्स्टबॉक्स (टेक्स्ट साफ़ करें) को अपडेट करना चाहता हूं, भले ही स्रोत प्रॉपर्टी वही रहे। हालांकि, मुझे कोई बाध्यकारी विकल्प नहीं मिला जो मैं चाहता हूं (एक अपडेटसोर्स ट्रिगर संपत्ति है, लेकिन मैं यहां लक्ष्य को अपडेट करना चाहता हूं, स्रोत नहीं)। शायद टेक्स्टबॉक्स को सूचित करने का एक बेहतर तरीका है कि इसे अपने टेक्स्ट को साफ़ करने की आवश्यकता है, मैं किसी भी सुझाव के लिए खुला हूं।

स्रोत, के रूप में अनुरोध (सरलीकृत)

DataContext (स्रोत):

private int? _foo; 

    public int? Foo 
    { 
     get 
     { 
      // The binding is working, because _foo is retrieved (hits a breakpoint here). 
      // RaisePropertyChanged("Foo") is called from elsewhere, even if _foo's value is not changed 
      return _foo; 
     } 
     set 
     { 
      // Breakpoint is hit on user input, so the binding is working 
      _foo = value; 
      RaisePropertyChanged("Foo"); 
     } 
    } 

कस्टम पाठ बॉक्स (लक्ष्य):

public double? Value 
{ 
    get 
    { 
     return (double?)GetValue(ValueProperty); 
    } 
    set 
    { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
      SetValue(ValueProperty, value); 

      // This is the piece of code that needs to be run whenever Value is set to null 
      if (value == null && !String.IsNullOrEmpty(Text)) 
      { 
       Text = String.Empty; 
      } 
     } 
    } 

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double?), typeof(CustomTextbox), new PropertyMetadata(null, ValueChangedHandler)); 

    private static void ValueChangedHandler(DependencyObject dependecyObject, DependencyPropertyChangedEventArgs e) 
     { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
     } 
+1

क्या आप कुछ कोड पोस्ट कर सकते हैं? यह आपके मुद्दे को और अधिक आसान समझ देगा। आप अपने डेटाकॉन्टेक्स्ट में प्रॉपर्टी चेंज इवेंट को कैसे बढ़ा रहे हैं? – wpfwannabe

+0

यह तब भी अपडेट होना चाहिए जब स्रोत समान हो। अपना कोड पोस्ट करें, समाधान स्पॉट करना आसान होना चाहिए। –

+0

मैंने कुछ कोड पोस्ट किया। यहां संपूर्ण स्रोत को शामिल करने के लिए एप्लिकेशन बहुत जटिल है। नाम बदल दिए गए थे। –

उत्तर

16

XAML setValue सीधे, बजाय बुलाने की कॉल करेंगे आपकी संपत्ति सेटर। मुझे बिल्कुल विशिष्टता याद नहीं है, लेकिन मैं थोड़ी देर पहले इसी तरह की समस्या में भाग गया था। आपको मूल्य के लिए सेटटर में कोई तर्क नहीं डालना चाहिए, इसके बजाय निर्भरता संपत्ति बदलते समय कॉलबैक को परिभाषित करना चाहिए, और वहां से मूल्य अपडेट करना चाहिए।

+0

बढ़िया! मैं देख रहा था कि सेट पर मेरा तर्क क्यों निष्पादित नहीं किया जा रहा था। –

+0

+1 - धन्यवाद, वैलेरी, आपने मेरा दिन बचाया! –

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