2012-07-13 8 views
6

आम तौर पर, मैं Window के गुणों को InitializeComponent() से पहले शुरू कर रहा हूं और बाद में निहित नियंत्रण स्थापित कर रहा हूं। हालांकि, मैं उन सभी संगत नहीं रहा हूं, और मैंने वास्तव में आदेश के साथ कोई समस्या नहीं देखी है। तो:एक WPF विंडो के लिए एक कन्स्ट्रक्टर में, InitializeComponent() से पहले क्या जाना चाहिए और इसके बाद क्या?

  • क्या मैं (संभावित रूप से) कुछ भयानक कर रहा हूं? विशेष रूप से, InitializeComponent() से पहले बाल नियंत्रण की गुणों को सेट करने के साथ कोई समस्या है?
  • इस संबंध में अच्छी शैली क्या है?

संपादित करें: के बाद से पहले दो जवाब मुझे मिल गया एक छोटा सा विरोधाभासी थे, मुझे और अधिक विशिष्ट हो:

public Foo Foo {get; protected set} 
public FooWindow (Foo foo) 
{ 
    Foo = foo; 
    this.Closing += FooWindow_Closing; 
    Foo.Frobbed += Foo_Frobbed; 

    InitializeComponent(); 

    this.DataContext = this; 
    this.Title = Foo.Name() + " Window"; 

    FooListView.ItemSource = Foo.CalculateList(); 

    FocusManager.SetFocusedElement(this, FooListView); 
} 

इस अधिकार के बारे में है? क्या मुझे बस एमवीवीएम करना चाहिए और मेरे Window कन्स्ट्रक्टर में कुछ भी नहीं है?

उत्तर

4

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

+5

यह ध्यान रखें कि, अगर MVVM का उपयोग कर, DataContext सेट किया जाना चाहिए ** से पहले महत्वपूर्ण है ** InitializeComponent() या फिर अपने ViewModel बाइंडिंग बुला ठीक से सेट नहीं किया जाएगा। प्रारंभिक कॉम्पोनेंट() आपकी सभी संपत्ति बाध्यकारी गेटर्स को कॉल करता है, इसलिए यदि इसे पहले कहा जाता है, तो आपके बाइंडिंग को उचित मान नहीं मिलेगा जब तक कि NotifyPropertyChanged को आपकी प्रत्येक प्रॉपर्टी पर दोबारा कॉल नहीं किया जाता है। यह वही सिद्धांत किसी अन्य प्रारंभिक तर्क पर लागू होता है जो आपके xaml को प्रारंभ करने के तरीके को प्रभावित कर सकता है। – jeff17237

2

मैं आमतौर पर कुछ भी कहता हूं जिसे कॉल करने से पहले विजुअल ट्री की आवश्यकता नहीं होती है प्रारंभिक कॉम्पोनेंट()

मेरे सभी कार्यान्वयन एमवीवीएम पैटर्न का उपयोग करते हैं, इसलिए मैं क्लाइंट को यूआई लोड होने से पहले अपना व्यूमोडेल तत्काल और पॉप्युलेट करना पसंद करता हूं।

आप हमेशा InitializeComponent लोड है() पहले, आप एक आबादी वाले राय यह है कि अचानक एक है कि से भर जाता है जब यह दृश्य में आएगा बनाम अद्यतन करता दिखा कर एक खराब उपयोगकर्ता अनुभव बनाने का जोखिम हो सकता।

+0

क्या यह वास्तव में एक समस्या है? मेरा मतलब है, उपयोगकर्ता तब तक नियंत्रण नहीं देख सकते जब तक कि हम 'विंडो। शो()' कहते हैं, जो तब तक नहीं होगा जब तक कि कन्स्ट्रक्टर पूरी तरह से बाहर नहीं निकलता। मुझे लगता है कि यह 'UserControl' के लिए एक अधिक समस्या हो सकती है, लेकिन फिर भी, ऑब्जेक्ट को असाइन किए जाने तक पूरी तरह से बनाया जाना चाहिए। – seeker

+0

हां, यह एक समस्या हो सकती है। – Xcalibur37

3
अपने विशिष्ट प्रश्न के जवाब में

:

एम आई (संभावित) कुछ भयानक कर? विशेष रूप से, InitializeComponent() से पहले बाल नियंत्रण की गुणों को सेट करने के साथ कोई समस्या है?

संभावना है कि आपके बच्चे के नियंत्रण कोड में तब तक उपलब्ध नहीं हैं जब तक आप InitializeComponents कहलाते हैं। ऐसा करने के लिए आम तौर पर यह खराब रूप होगा।

इस संबंध में अच्छी शैली क्या है?

यह स्वाद का विषय होने वाला है, लेकिन आम तौर पर मैं अनुशंसा करता हूं कि यदि आप XAML को अलग करने के अलगाव का लाभ उठाने जा रहे हैं तो मैं इसे जितना कर सकता हूं उतना ले जाऊंगा। यदि आप यूआई के बारे में तार्किक रूप से चीजें कर रहे हैं तो इसे एक्सएएमएल में करने का प्रयास करें। यह एक एमवीवीएम चीज नहीं है क्योंकि यह तर्क से प्रस्तुति को अलग करता है। आपके नमूना कोड में जो कुछ भी है, वह घोषणात्मक रूप से किया जा सकता है, भले ही केवल ValueConverters के माध्यम से।

E.g अगर फू एक निर्भरता प्रॉपर्टी थी तो आप इसे एक्सएएमएल में भी संलग्न कर सकते हैं और वैल्यू चेंज कॉलबैक के हिस्से के रूप में कॉलबैक जोड़ सकते हैं। फिर, यह एमवीवीएम नहीं है, लेकिन यह WPF के लिए बहुत मौलिक है।

अधिकांश अन्य चीजों के लिए, आप शायद कन्स्ट्रक्टर में काम करने के बजाए ऑनलोडेड कॉल होने तक प्रतीक्षा करना चाहते हैं।

आशा है कि मदद करता है,

+0

मैं पहले भाग पर विश्वास करना शुरू कर रहा हूं, लेकिन इसमें कोई समस्या नहीं है (जैसा कि [इस प्रश्न में उल्लिखित है) (http://stackoverflow.com/questions/1654490/wpf-bad-practice-to-put-code -डायरेक्ट-बाद-प्रारंभिक कंपोनेंट)) ऑनलोडेड को कई बार बुलाया जा रहा है? – seeker

+1

जब भी आपका नियंत्रण लोड हो जाता है, ऑनलोडेड कॉल किया जाएगा, जो घटनाओं को हुक करने के लिए उचित समय है। आप उन्हें ऑनयूलोडेड में भी देखना चाहते हैं। यदि यह एक खिड़की है तो वास्तव में आपको कभी-कभी ऑनलोडेड को कई बार नहीं देखा जाना चाहिए, लेकिन आमतौर पर नियंत्रण के बारे में सावधान रहना कुछ है (लिंक किया गया प्रश्न पेजों को संदर्भित करता है, जो अक्सर लोड/अनलोड किए जाते हैं)। –

+0

आपके सूचनात्मक उत्तर के लिए धन्यवाद। (क्षमा करें, मैं केवल एक जवाब स्वीकार कर सकता हूं, और दूसरा पहले आया था।) – seeker

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