2012-01-07 6 views
6

डब्ल्यूपीएफ कभी-कभी परेशान हो सकता है।एक WPF विंडो और उसके उपयोगकर्ता नियंत्रण के बीच डेटा साझा करने का सबसे अच्छा तरीका क्या है?

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

मेरी मुख्य विंडो के अंदर मेरे पास एक ऑब्जेक्ट का एक उदाहरण है जिसमें एप्लिकेशन सेटिंग्स और कुछ अन्य एप्लिकेशन-व्यापी डेटा शामिल हैं। मेरे कई टैबों को डेटा बाध्यकारी उद्देश्यों के लिए इस डेटा तक पहुंच की आवश्यकता है। मैं इसे पूरा करने के लिए एक अच्छा तरीका खोजने में सक्षम नहीं हूं।

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

private void MyUserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.ApplicationSettings = ((MainWindow)Window.GetWindow(this)).ApplicationSettings; 
} 

फिर मैंने उपयोगकर्ता नियंत्रण नियंत्रक में डेटा को पारित करने के साथ प्रयोग किया, लेकिन XAML में ऐसा करने का कोई तरीका नहीं है।

यह देखते हुए कि इन मैं ApplicationSettings वर्ग सिंगलटन बनाने के लिए और यह हर जगह संदर्भ सकता है आवेदन-व्यापी सेटिंग कर रहे हैं, लेकिन मैं ऐसा करने के लिए नहीं है कि इकाई परीक्षण प्रयोजनों के लिए पसंद करेंगे।

तो कोई ऐसा कुछ कैसे पूरा करता है? क्या मेरा दृष्टिकोण सिर्फ मौलिक रूप से त्रुटिपूर्ण है? मेरे दिमाग में ये सभी यूआई तत्व एक ही विंडो का हिस्सा हैं और इसलिए मुख्य विंडो से डेटा तक पहुंचने में सक्षम होना चाहिए, लेकिन ऑब्जेक्ट मॉडल इसे अनुमति देने के लिए प्रकट नहीं होता है।

उत्तर

2

आप इस उदाहरण में SettingsHolder एक आवरण कक्षा में एक स्थिर संपत्ति में डाल सकता है सेटिंग्स वस्तु (और व्यापक यह आवेदन संदर्भ

के माध्यम से XAML में:

{Binding SettingName, Source={x:Static local:SettingsHolder.Settings}} 

local साथ नाम स्थान अपने SettingsHolder किया जा रहा है कक्षा में है

संहिता में

:।

var x = SettingsHolder.Settings.SettingName; 
SettingsHolder.Settings.SettingName = x; 
+0

मुझे लगता है कि यह वह मार्ग है जिसे मैं लेने जा रहा हूं। जैसा कि मैंने मूल पोस्ट में कहा था, मैं सिंगलटन व्यवहार को वास्तविक सिंगलटन के बिना चाहता हूं, और यह मुझे वह देता है। असल में, मैं शायद कक्षा सिंगलटन बनाउंगा, लेकिन परीक्षण उद्देश्यों के लिए निर्माता को छोड़ दूंगा। धन्यवाद! – EricTheRed

1

अपने उपयोगकर्ता नियंत्रण की घोषणा में आप सिर्फ वस्तु का उदाहरण है कि सभी चीजों को आप के लिए बाध्य करने के लिए आवश्यकता होती है करने के लिए डेटा संदर्भ सेट कर सकते हैं!

<someNamespace:EricsUserControl DataContext="{Binding InstanceOfBindingObject}"/>

तो फिर तुम संपत्तियों की है कि 'आप सामान्य रूप से उपयोगकर्ता नियंत्रण के भीतर उदाहरण वस्तुओं का उपयोग कर सकते हैं।

+0

यह जानना वाकई अच्छा है, और मैं इसे किसी अन्य चीज के लिए उपयोग कर सकता हूं, लेकिन मैं कोड में सेटिंग्स तक पहुंचने के लिए विकल्प को भी खोलना चाहता हूं। – EricTheRed

+0

@EricTheRed पूरी तरह समझदार है, लेकिन केवल एक सिर ऊपर है, आप कोड के भीतर उपयोगकर्ता नियंत्रण के लिए डेटाकॉन्टेक्स्ट तक पहुंच सकते हैं। तो यदि आप उपरोक्त के रूप में इंस्टेंस ऑब्जेक्ट से बाध्य हैं और फिर कोड-बैक फ़ाइल के भीतर कुछ छोटे 'var myInstance = (BindingObjectClass) ने किया था। DataContext' आप उस ऑब्जेक्ट को myInstance चर से एक्सेस करने में सक्षम हो सकते हैं! उम्मीद है कि भविष्य में कुछ समय में मदद करता है! – Kevek

0

मैं 10 में Frame का उपयोग करता हूं और Frame में Page डालता हूं। (लेकिन मुझे लगता है कि यह उपयोगकर्ता नियंत्रण के साथ भी लागू हो सकता है)। कन्स्ट्रक्टर केवल तभी चला जाता है जब पृष्ठ बनाया जाता है और जब पृष्ठ बनाया जाता है तो आप नियंत्रित कर सकते हैं और आप कन्स्ट्रक्टर में जानकारी पास कर सकते हैं। एक पृष्ठ में टाई जाने के लिए और अधिक जीवन चक्र घटनाएं होती हैं। मैं यूआई के निर्माण के लिए लोडेड इवेंट का भी उपयोग करता हूं (यह सिर्फ एक बार आग लग जाता है)। यदि आप XAML में पृष्ठ को बाध्य करते हैं तो आप ऐप शुरू करते समय आग लगेंगे और आप जानकारी पास नहीं कर सकते हैं। यह एक पृष्ठ बना रहा है और इसे एक संवाद में दिखा रहा है लेकिन वह पृष्ठ एक फ्रेम से बंधे जा सकते हैं।

 NavigationWindow winSearchXML; 
     using (new WaitCursor()) 
     { 
      winSearchXML = new NavigationWindow(); 
      winSearchXML.Content = new PageSearchResultsXML(GabeLib.GetSearchXML(GabeLib.enumXMLtype.Flat)); 
     } 
     winSearchXML.ShowDialog(); 

मैं ईमानदारी से है कि कुछ समय मैं एक पेज है कि मैं सिर्फ समझ में नहीं आता पर एक जीवन चक्र पाने की जरूरत है। तो इसे नमक के अनाज के साथ ले लो। लेकिन मुद्दा यह है कि आपके पास रचनाकार और लोड की गई घटनाएं हैं जो आपको जो चाहिए वह आपको दे सकती हैं।

+0

यह चालाक है! मैंने कभी ऐसा कुछ करने का सोचा नहीं। मुझे लगता है कि मैं किस पर काम कर रहा हूं, हालांकि यह थोड़ा अधिक है। हालांकि विचार के लिए धन्यवाद। – EricTheRed

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

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