2009-03-09 21 views
52

के साथ एंटीटी फ्रेमवर्क का उपयोग करने के लिए सर्वोत्तम प्रथाएं मैं अपना पहला वास्तविक WPF एप्लिकेशन (यानी, मेरे अलावा किसी के द्वारा उपयोग किए जाने वाले पहले व्यक्ति) को बनाने की प्रक्रिया में हूं, और मैं अभी भी अपने सिर को लपेट रहा हूं डब्ल्यूपीएफ में चीजों को करने का सबसे अच्छा तरीका। यह अभी भी काफी नए एंटिटी फ्रेमवर्क का उपयोग करके एक काफी सरल डेटा एक्सेस एप्लिकेशन है, लेकिन मैं इन दो तकनीकों (डब्ल्यूपीएफ और ईएफ) को एक साथ उपयोग करने के सर्वोत्तम तरीके के लिए ऑनलाइन बहुत सारे मार्गदर्शन नहीं ढूंढ पा रहा हूं। तो मैंने सोचा कि मैं टॉस आउट करूँगा कि मैं इसे कैसे देख रहा हूं, और देखें कि किसी के पास कोई बेहतर सुझाव है या नहीं।WPF डेटा बाइंडिंग

  • मैं एसक्यूएल सर्वर 2008 एफई मुझे के रूप में दोनों और अधिक जटिल की तुलना में यह करने की जरूरत है, और अभी तक परिपक्व नहीं है, लेकिन Linq करने वाली एसक्यूएल जाहिरा तौर पर मृत है, इसलिए हमलों के साथ इकाई की रूपरेखा का उपयोग कर रहा मैं उस तकनीक का भी उपयोग कर सकता हूं जो एमएस पर ध्यान केंद्रित कर रहा है।

  • यह एक साधारण एप्लीकेशन है, इसलिए मैंने इसके आसपास एक अलग डेटा परत बनाने के लिए (अभी तक) फिट नहीं देखा है। मैं डेटा पर प्राप्त करना चाहते हैं, मैं काफी सरल Linq करने वाली इकाई प्रश्नों का उपयोग, आम तौर पर सीधे मेरी कोड-पीछे, जैसे से:

    var families = from family in entities.Family.Include("Person") 
          orderby family.PrimaryLastName, family.Tag 
          select family; 
    
  • Linq करने वाली इकाई प्रश्नों एक IOrderedQueryable परिणाम लौटने के लिए, जो नहीं करता है अंतर्निहित डेटा में स्वचालित रूप से परिवर्तनों को प्रतिबिंबित नहीं करते हैं, उदाहरण के लिए, यदि मैं इकाई डेटा मॉडल में कोड के माध्यम से एक नया रिकॉर्ड जोड़ता हूं, तो इस नए रिकॉर्ड का अस्तित्व लिंक क्वेरी के संदर्भ में विभिन्न नियंत्रणों में स्वचालित रूप से दिखाई नहीं देता है। नतीजतन, मैं अंतर्निहित डेटा परिवर्तन पर कब्जा करने के एक ObservableCollection में इन प्रश्नों के परिणामों फेंक रहा हूँ,:

    familyOC = new ObservableCollection<Family>(families.ToList()); 
    
  • मैं तो, एक CollectionViewSource को ObservableCollection नक्शा ताकि मैं छानने प्राप्त कर सकते हैं, सॉर्टिंग आदि, डेटाबेस में वापस आने के बिना। जब मैं रिकार्ड/वस्तुओं को जोड़ने या हटाने की जरूरत है

    <ListBox DockPanel.Dock="Bottom" Margin="5,5,5,5" 
        Name="familyList" 
        ItemsSource="{Binding Source={StaticResource familyCVS}, Path=., Mode=TwoWay}" 
        IsSynchronizedWithCurrentItem="True" 
        ItemTemplate="{StaticResource familyTemplate}" 
        SelectionChanged="familyList_SelectionChanged" /> 
    
  • , मैं मैन्युअल रूप से दोनों इकाई डेटा से ऐसा कर:

    familyCVS.Source = familyOC; 
    familyCVS.View.Filter = new Predicate<object>(ApplyFamilyFilter); 
    familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("PrimaryLastName", System.ComponentModel.ListSortDirection.Ascending)); 
    familyCVS.View.SortDescriptions.Add(new System.ComponentModel.SortDescription("Tag", System.ComponentModel.ListSortDirection.Ascending)); 
    
  • मैं तो उस CollectionViewSource के लिए विभिन्न नियंत्रण और क्या-नहीं बाँध मॉडल, और ObservableCollection:

    private void DeletePerson(Person person) 
    { 
        entities.DeleteObject(person); 
        entities.SaveChanges(); 
        personOC.Remove(person); 
    } 
    
  • मैं आम तौर पर उपयोग कर रहा हूँ StackPanel और DockPanel तत्वों स्थिति नियंत्रित करता है। कभी-कभी मैं ग्रिड का उपयोग करूंगा, लेकिन यह बनाए रखना मुश्किल लगता है: यदि आप अपने ग्रिड के शीर्ष पर एक नई पंक्ति जोड़ना चाहते हैं, तो आपको ग्रिड द्वारा होस्ट की गई हर नियंत्रण को सीधे एक नई लाइन का उपयोग करने के लिए स्पर्श करना होगा। Uggh।

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

  • मेरा अधिकांश वास्तविक कोड XAML की बजाय सी # में है। मैं तथ्य यह है कि मैं अभी तक के लिए उस में "सोच" का इस्तेमाल किया नहीं कर रहा हूँ से elsewhere उल्लेख किया है, पूरी तरह से अलग, XAML मुझे एक भद्दा, बदसूरत भाषा है, वह भी गरीब डिजाइनर और IntelliSense समर्थन के साथ आने के लिए होता है के रूप में हमलों, और कहा कि डीबग नहीं किया जा सकता है। Uggh। नतीजतन, जब भी मैं स्पष्ट रूप से देख सकता हूं कि सी # कोड में कुछ कैसे करना है, इसके पीछे मैं आसानी से नहीं देख सकता कि एक्सएएमएल में कैसे करना है, मैं इसे सी # में करता हूं, माफ़ी नहीं।WPF पृष्ठ (कहें, ईवेंट-हैंडलिंग के लिए) में कोड-बैक का उपयोग करने के लिए यह एक अच्छा अभ्यास नहीं है, लेकिन अब तक कम से कम, यह मुझे कोई समझ नहीं आता है। मुझे ईश्वरीय भयानक वाक्यविन्यास, एक आश्चर्यजनक रूप से खराब संपादक, और वस्तुतः कोई प्रकार की सुरक्षा के साथ बदसूरत, गुंजाइश भाषा में कुछ क्यों करना चाहिए, जब मैं एक अच्छी, साफ भाषा का उपयोग कर सकता हूं जैसे सी # जिसमें एक विश्व स्तरीय संपादक है, जो कि बिल्कुल सही है Intellisense, और अद्वितीय प्रकार की सुरक्षा?

तो मैं वहीं हूं जहां मैं हूं। कोई सुझाव? क्या मुझे इसका कोई बड़ा हिस्सा याद आ रहा है? कुछ भी जो मुझे वास्तव में अलग-अलग करने के बारे में सोचना चाहिए?

+0

बनाम 2010/fw4.0: ऐसा लगता है कि आइटमसोर्स परिवार के लिए बाध्य होना चाहिए CVS.View (परिवार सीवीएस के बजाय) –

उत्तर

19

आप तो फिर तुम जेनरिक का उपयोग कम करने के लिए कर सकते हैं एफई

से WPF चिंताओं

अलग करने के लिए भंडार पैटर्न लागू करने की आवश्यकता संग्रह ViewSource हैंडलिंग के लिए ईएफ की जटिलता

एक अच्छी तरह से डिज़ाइन किया गया भंडार कोड स्तर को कम करना चाहिए और किसी भी ओआरएम को प्रतिस्थापित करने में सक्षम होना चाहिए (सभ्य के लिए आवश्यक परीक्षण)

इस के लिए कुछ विचार यहाँ

http://blog.nicktown.info/2008/12/10/using-a-collectionviewsource-to-display-a-sorted-entitycollection.aspx

+0

यह संभवतः मुझे लगता है कि बड़ा टुकड़ा था, और यह मूल्यवान लगता है। धन्यवाद। –

+0

इस उत्तर के अंत में लिंक अब मृत है। – Cylindric

+1

सच है, लेकिन वेबैक मशीन [अभी भी एक प्रति है] (http://web.archive.org/web/20130924230947/http://blog.nicktown.info/2008/12/10/using-a-collectionviewsource- टू-डिस्प्ले-ए-सॉर्टेड-entitycollection.aspx) (दान करने पर भी विचार करें!)। – sorrell

4

मेरी सिफारिशें, यदि संभव हो तो कोड के पीछे और दृश्य स्टूडियो डिजाइनर का उपयोग करने के बजाय, आपके इंटरफ़ेस को डिज़ाइन करने के लिए अभिव्यक्ति मिश्रण का उपयोग करें, यह आपको बहुत समय बचाएगा। Xaml के बजाय सी # का उपयोग करके पुनर्विचार करने का भी प्रयास करें। यदि आप इसे "डब्ल्यूपीएफ वे" करते हैं तो एक्समल इतना बदसूरत नहीं है। अक्सर बार, जब मुझे लगता है कि xaml के बजाए कोड का उपयोग करना आसान है, तो ऐसा इसलिए है क्योंकि मैं इसे गलत तरीके से कर रहा हूं और इसे पुनर्विचार करने की आवश्यकता है कि इसे WPF/xaml के साथ सबसे अच्छा कैसे काम करना चाहिए। एक बार जब आप इसका इस्तेमाल करते हैं तो ज़ैमल बहुत अच्छा होता है। मैंने इकाई ढांचे का भी उपयोग किया है जो अभी तक बहुत अच्छा नहीं है। मैं NHibernate पसंद करते हैं।

+0

मैं एक्सएएमएल के साथ प्रयास करूंगा। लेकिन इस तथ्य को हासिल करना मुश्किल है कि एक्सएएमएल संपादक पत्थर की आयु (मिश्रण में कोई इंटेलिजेंस नहीं है !!??), और एक्सएएमएल सिंटैक्स इतना ईश्वर भयानक बदसूरत है। Yeccch। –

+7

संपादन XAML हमेशा मुझे लगता है कि कच्चे ब्रोकोली खाने की तरह, कोई डुबकी नहीं है। संभवतः यह मेरे लिए अच्छा है, लेकिन यह स्वाद है जैसे मैं एक पेड़ खा रहा हूँ। –

7

इसके अलावा, मुझे नहीं लगता कि आपको यहां एक ToList() करने की आवश्यकता है। मेरा मानना ​​है कि ObservableCollection() एक आईनेमरेबल लेता है जो परिवार पहले से ही है। यदि आप एक ToList करते हैं, और फिर इसे ऑब्जर्जेबल कोलेक्शन में पास करते हैं, तो मुझे लगता है कि आप अपने सभी रिकॉर्ड दो बार लूप करेंगे।

familyOC = new ObservableCollection<Family>(families.ToList()); 

इसके बजाय, इस कोशिश है, जो थोड़ा तेजी से किया जाना चाहिए:

familyOC = new ObservableCollection<Family>(families); 
+0

धन्यवाद। मैंने जोड़ा कि एक अलग त्रुटि की समस्या निवारण में, और इसे कभी नहीं लिया। –

5

मैं समझता हूँ कि आप कहाँ से आ रहे हैं। यह article by Josh Smith ने मुझे मानसिकता को बदलने (या बदलने के लिए शुरू) की मदद की ताकि आप इसे एक अजीब, बाधाकारी, हार्ड-टू-डीबग और असभ्य ढांचे के रूप में देखने के बजाय WPF से कुछ लाभ प्राप्त कर सकें!

1

एक अन्य उपकरण हो सकता है BindableLINQ

Bindable LINQ कि मानक LINQ के लिए बाध्य डेटा जोड़ने और प्रचार क्षमताओं को बदलने LINQ करने के लिए एक्सटेंशन का एक सेट है प्रश्नों

2

मैं अपने ब्लॉग से इस लिंक का पालन किया और कुछ उल्लेख करना चाहता था अन्यथा मैं ईएफ के साथ मिला। विषय बंद, लेकिन पूरी तरह से नहीं।

मैंने उपयोग करते समय ईएफ के साथ कुछ पागल प्रदर्शन मुद्दों को देखा है। शामिल करें। एमएस बताता है कि क्यों उनकी वेबसाइट पर एक लेख में मैंने वास्तव में अपने अधिकांश कोड को स्थानांतरित करने के लिए लोड किया है। इसके बजाय लोड विधि का उपयोग करें।

क्योंकि यह करने के लिए एक कठिन काम है और क्योंकि मुझे ऐसा करने का कोई और तरीका नहीं मिला ... मैंने अपनी खुद की विधि "IncludeByRoundTrip" नामक बनाई। यह क्या करता है एक ऑब्जेक्ट पथ लेता है और सुनिश्चित करता है कि पूरा पथ लोड हो गया है।अंत परिणाम वही है जब दृश्यों के पीछे उपयोग करना शामिल है, मैं ऑब्जेक्ट ग्राफ़ में सभी गुणों पर लोड को कॉल कर रहा हूं।

यह आदेश की तरह कुछ करने जैसा ही होगा। लोड ("ग्राहक। एड्रेस") यदि ऐसा तंत्र मौजूद था। किसी भी तरह से, इसे मेरे ब्लॉग पर देखें और मुझे अपने निष्कर्ष बताएं। मैं यह देखने के लिए उत्सुक होगा कि क्या दूसरों ने शामिल होने का उपयोग करके मंदी देखी है और यदि आपके पास स्थिति पर हमला करने के लिए अन्य दृष्टिकोण हैं।

मेरे समाधान पर अधिक जानकारी है: http://blog.nicktown.info/2009/07/27/method-to-load-an-entire-object-graph-using-adonet-entity-framework.aspx

फिर, खेद है कि यह थोड़ा सा विषय था, लेकिन मैं आपके जवाबों की प्रतीक्षा करता हूं।

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