2010-03-25 13 views
14

के दौरान नियंत्रण शून्य नियंत्रण प्राप्त करना तो मेरे InitializeComponent विंडो के कन्स्ट्रक्टर में विधि कॉल एक्सएमएल के माध्यम से चल रहा है और नियंत्रण जोड़ रहा है और उन्हें अपने कार्यक्रमों में प्लग कर रहा है।डब्ल्यूपीएफ प्रारंभिक कॉम्पोनेंट

तो जब नियंत्रण में से किसी एक की संपत्ति बदल जाती है तो यह उस ईवेंट को कॉल करता है जो ईवेंट की सदस्यता लेता है। विधि उस नियंत्रण का संदर्भ देती है जिसे अभी तक नहीं बनाया गया है।

यह आदेश इस क्रम में क्यों होता है? यह WinForms में काम किया क्योंकि सभी नियंत्रणों के निर्माण के बाद घटनाओं को बाद में निकाल दिया नहीं गया था। क्या डब्ल्यूपीएफ में इसे मजबूर करने का कोई तरीका है?

अन्य समाधान मैं देख रहा हूँ

  • मैं आरंभीकरण के बाद की घटनाओं की सदस्यता के लिए की जरूरत है।

  • जब भी मैं नियंत्रण से निपटता हूं तो मुझे शून्य की जांच करने की आवश्यकता होती है।

+0

के बाद कोड में सेट किया गया यह विशेष रूप से जानना उपयोगी होगा कि कौन सी घटनाएं समस्या पैदा कर रही हैं - क्या आप थोड़ा और विस्तार जोड़ सकते हैं? हालांकि मुझे संदेह है कि उत्तर आपका पहला बुलेट बिंदु हो सकता है ... –

+0

क्या आप अधिक वास्तुकला की व्याख्या कर सकते हैं? मुझे उत्सुकता है कि एक संपत्ति में ईवेंट सदस्यता क्यों होगी। –

उत्तर

23

मुझे अभी भी यह समस्या थी, और इसे शून्य नियंत्रण में शून्य नियंत्रण को एक्सेस करने वाली रेखा को लपेटकर हल किया गया। यह एक हैक वर्कअराउंड की तरह लगता है।

मुझे लगता है कि WPF InitializeComponent() के दौरान हमारे चेक किए गए ईवेंट को कॉल करके यहां सहायक होने का प्रयास कर रहा है, ताकि यह सुनिश्चित किया जा सके कि कोई UI तर्क (उदाहरण के लिए संबंधित घटकों को दिखा रहा/छुपाएं) चेकबॉक्स की प्रारंभिक स्थिति के आधार पर निष्पादित किया गया है । मैंने डिफ़ॉल्ट रूप से चेकबॉक्स को अनचेक किया है, और ईवेंट हैंडलर को कॉल नहीं किया गया है, भले ही मैंने इसे चेक किए गए और अनचेक किए गए ईवेंट दोनों के लिए तार दिया हो। मैंने इसे स्क्रीन पर एक ही चेकबॉक्स के साथ एक खाली WPF प्रोजेक्ट में भी पुन: उत्पन्न किया, और यह वही व्यवहार करता है।

इस डिफ़ॉल्ट व्यवहार के साथ समस्या स्पष्ट रूप से है कि कुछ अन्य घटकों को अभी तक प्रारंभ नहीं किया गया है। मुझे लगता है कि WPF को प्रतीक्षा करनी चाहिए जब तक कि सभी घटकों को डिफ़ॉल्ट रूप से चेक किए गए ईवेंट को फायर करने से पहले प्रारंभ नहीं किया जाता है।इसे एक बग नहीं माना जा सकता है, लेकिन मैं प्रासंगिक एमएसडीएन पेज पर एक नोट जोड़ने वाला हूं ...

0

दो-तरफा डाटाबेसिंग का उपयोग कर नियंत्रण में से कोई भी नियंत्रण है? मैंने इस मुद्दे पर भाग लिया है जहां मेरे पास व्यूमोडेल पर गुणों के लिए टेक्स्टबॉक्स हैं। व्यूमोडेल प्रारंभिकता आईएनओटीफाइप्रोपर्टी को बाध्यकारी नियंत्रण में बदल रही थी, जिससे बदले में टेक्स्टबॉक्स की टेक्स्ट चेंजेड घटना को आग लग गई। मेरा शॉर्ट-टर्म वर्कअराउंड इवेंट सदस्यता को विंडो लोडेड इवेंट में ले जाना था, लेकिन जैसा कि आप कहते हैं, यह एक दर्द है। मुझे ऑब्जेक्ट्स को प्रारंभ करने के तरीके में ऑर्डर बदलने के लिए कोड को दोबारा करने की आवश्यकता है, ताकि WPF Views (यानी विंडोज़ और उपयोगकर्ता नियंत्रण) ViewModels से पहले बनाए गए हों। फिर मैं ईवेंट हैंडलर पंजीकरण को वापस एक्सएएमएल में ले जा पाऊंगा।

+0

मैं किसी भी संकलन समय डेटाबेस का उपयोग नहीं कर रहा हूँ। – rediVider

4

आपको अपनी विंडो पर IsInitialized या IsLoaded गुणों को जांचने में सक्षम होना चाहिए ताकि यह सत्यापित हो सके कि यह प्रारंभ/लोडिंग समाप्त हो गया है। अन्यथा, आपको अपने कोड में (प्रारंभिक कॉम्पोनेंट के बाद) में नल की जांच करनी होगी या अपनी इवेंट सदस्यता जोड़नी होगी।

इसके अलावा, आप तत्वों तक पहुंचने के तरीके को समायोजित करने में सक्षम हो सकते हैं। पीछे आप सूची बॉक्स कई तरीके प्राप्त कर सकते हैं अपने कोड में

<ListBox x:Name="listBox" SelectionChanged="OnListBoxSelectionChanged" /> 

तब:

private void OnListBoxSelectionChanged(object sender, SelectionChangedEventArgs e) { 
    ListBox lb = this.listBox; // May be null 
    ListBox lb = sender as ListBox; // Should never be null 
    ListBox lb = e.Source as ListBox; // Same as sender in this case 
    ListBox lb = e.OriginalSource as ListBox; // Always the element that started the event (if handler is not attached directly to ListBox). 
    // ... Do Something ... 
} 
+0

मेरे पास निरंतर एन/डिस-एबलिंग के साथ एक व्यस्त रूप है। मुझे लगता है कि इनिट रन के बाद मुझे इवेंट सदस्यता को कन्स्ट्रक्टर में ले जाना होगा। – rediVider

5

यह एक radiobutton पर जांच की गई घटना थी उदाहरण के लिए, अगर आप की तरह कुछ है। जब मैंने xaml से चेक किए गए = "सत्य" को हटा दिया तो समस्या दूर हो गई। (हालांकि खिड़की शुरू होने पर यह जांच की जाती है)। यह सुनिश्चित नहीं है कि यहां क्या हो रहा है, लेकिन कम से कम मुझे इसे ठीक करने के लिए कुछ भी बड़ा बदलाव नहीं करना पड़ेगा ... अभी तक।

+0

धन्यवाद rediVider, आपका समाधान मेरे लिए काम किया (मैं .NET 4.5.1 का उपयोग कर रहा था)। –

0

विंडो नियंत्रण आग की जांच की जा रही उप-नियंत्रण शुरू करते समय जांच की गई घटनाओं को प्रारंभ किया जाता है और प्रारंभ के रूप में चेक करने के लिए सेट किया जाता है मूल्य।

मुझे दृढ़ता से राय है कि यह एक बग है। बस तथ्य यह है कि यह एमएफसी असेंबली के भीतर गहरी से एक NullReferenceException आग लगाना चाहिए यह उम्मीद करने के लिए पर्याप्त होना चाहिए कि यह अनजान व्यवहार है।

ध्यान में रखते हुए कि Xaml संपादक आपके नियंत्रण आंशिक वर्ग के भीतर हैंडलर फ़ंक्शंस बनाता है और यदि यह वर्ग निर्मित नहीं हो रहा है तो यह ईवेंट को संभाल नहीं सकता है। मुझे लगता है कि जांच के लिए शुरू की गई सेटिंग के रूप में आपकी सेटिंग को नियंत्रित करने के लिए एक चेक किए गए ईवेंट को फायरिंग नहीं लगता है।

मेरा मतलब है, क्या यह अनचेक किए गए ईवेंट को आग लगाना चाहिए यदि आपने इसे अनचेक करने के लिए प्रारंभिक स्थिति सेट की है?

1

मुझे एक ही समस्या थी और मुझे लगता है कि यह एक बग है। मुझे एक कामकाज मिला हालांकि: मैंने Xaml से 'Ischecked' हटा दिया और इसे init

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