2009-08-19 18 views
8

के बाद बुलाया गया है, मैं एक WPF कस्टमकंट्रोल बना रहा हूं जिसमें PropertyChangedCallback के साथ निर्भरता संपत्ति है। उस कॉलबैक विधि में मैं कुछ नियंत्रण भागों के मानों को सेट करने का प्रयास करता हूं जिन्हें मैं GetTemplateChild() विधि का उपयोग कर OnApplyMethod से पुनर्प्राप्त करता हूं।WPF कस्टमकंट्रोल: OnApplyTemplate को PropertyChangedCallback

समस्या यह है कि PropertyChangedCallback (कुछ सिस्टम पर) OnApplyTemplate से पहले बुलाया जाता है ताकि नियंत्रण भाग अभी भी शून्य हो।

मैं जिस वर्कअराउंड का उपयोग कर रहा हूं वह है प्रॉपर्टी चेंज कैलबैक से सदस्य परिवर्तक से e.NewValue को बचाने के लिए और फिर OnApplyTemplate() में SetValue (dp, _savedValue) को कॉल करें।

इस समस्या से निपटने का सही तरीका क्या है या क्या मैं पहले से ही सबसे अच्छा समाधान का उपयोग कर रहा हूं?

+2

सुनिश्चित नहीं है कि किसी ने अभी तक आपके प्रश्न का उत्तर क्यों नहीं दिया है, लेकिन मैं कह सकता हूं कि मैं वही काम कर रहा हूं जैसा कि आप अभी तक काम करते हैं। मैंने हाल ही में एक स्प्लिटबटन कार्यान्वयन में एक विशेष समस्या में भाग लिया है जो ऐसा करता है जहां पहला चयनित आइटम दिखाई नहीं देता है लेकिन मैन्युअल रूप से किसी आइटम को चुनने के बाद यह करता है। – jpierson

उत्तर

7

यही वह है जो हम करते हैं - priciple में problme हल नहीं करता है लेकिन इसे ठीक करने के लिए एक स्पष्ट तरीका प्रदान करता है।

  1. डीपी मूल्य बदल घटना के लिए कोई हैंडलर बनाएँ, यह OnValueChanged जा (हैं)। आम तौर पर कोई पैरामीटर जैसा कि आप जानते हैं जो डीपी बदल गया है और हमेशा अपने वर्तमान मूल्य प्राप्त कर सकते हैं की जरूरत है।

  2. कन्स्ट्रक्टर के साथ डिफर्रेडएक्शन नामक एक वर्ग/संरचना बनाएं, सिस्टम स्वीकार कर रहा है। क्रिया (जो आपके ऑनवैल्यू चेंज() को रेफरी होगी)। कक्षा में संपत्ति एक्शन और एक विधि होगी, जिसे निष्पादन() कहा जाता है।

यहाँ मैं क्या उपयोग है:

class DeferredAction 
{ 
    private Action action; 

    public DeferredAction(Action action) 
    { 
     this.action = action; 
    } 

    private Action Action 
    { 
     get { return this.action; } 
    } 

    public void Execute() 
    { 
     this.Action.Invoke(); 
    } 
} 
  1. अपने नियंत्रण में एक सूची बना। संग्रह DeferredAction की सूची तब तक रखेगा जब तक उन्हें सफलतापूर्वक लागू नहीं किया जा सकता (आमतौर पर base.OnApplyTemplate() के बाद)। एक बार कार्रवाई लागू हो जाने के बाद संग्रह को डबल प्रोसेसिंग से बचने के लिए साफ़ किया जाना चाहिए।

  2. ऑनवैलू के भीतर जांचें कि क्या आपका पार्ट शून्य नहीं है (जो संभवतः है) और यदि ऐसा है तो पिछले चरण में बनाई गई सूची में DeferredAction (OnValueChanged() का एक नया उदाहरण जोड़ें। नोट, OnValueChanged () एक दोहरी उद्देश्य हैंडलर है जिसे आपके डीपी वैल्यू चेंज हैंडलर से सही कहा जा सकता है, अगर पार्ट्स नल नहीं हैं, तो इसका उपयोग निष्पादन योग्य स्थगित कार्रवाई के रूप में किया जाता है।

  3. आपके भीतर आपके स्थगित कार्यों की सूची के माध्यम से OnApplyTemplate पाश (आप पता है, अगर वे वहां हैं, तो उन्हें लागू नहीं किया गया है) और उनमें से प्रत्येक के लिए निष्पादन कॉल करें। अंत में सूची साफ़ करें।

चीयर्स