2013-01-03 21 views
14

पर कनवर्ट किए गए INotifyProperty को लागू करें मेरे पास एक SQL डीबी है और इसे अपडेट करने के लिए एक WPF UI लागू कर रहा हूं। यदि मैं डीबी से कक्षाएं उत्पन्न करने के लिए ईएफ 5 का उपयोग करता हूं, तो मैं जेनरेटेड कक्षाओं और गुणों पर छेड़छाड़ की गई IotifyProperty को कैसे कार्यान्वित कर सकता हूं ताकि मैं उन्हें यूआई के साथ आसानी से बांध सकूं? क्या इसे हासिल करने का कोई आसान तरीका है?जेनरेट एंटिटी फ्रेमवर्क क्लासेस

धन्यवाद

उत्तर

13

आप WPF के लिए सिफारिश की MVVM पैटर्न का पालन करते हैं, तो आप मॉडल के रूप में अपने उत्पन्न कक्षाओं का इलाज कर सकते हैं, और फिर ViewModel रैपर कि INotifyPropertyChanged लागू लिखें। व्यूमोडेल कक्षाएं आपके डीबी कक्षाओं तक पहुंचेंगी और एक्सएएमएल में आपके यूआई से जुड़ने वाली संपत्तियों का पर्दाफाश करेंगी।

जैसा कि आपकी टिप्पणी में उल्लेख किया गया है, इसके परिणामस्वरूप बॉयलरप्लेट कोड लिखने के बहुत सारे काम हो सकते हैं, लेकिन इससे निपटने के कुछ तरीके हैं। कुछ विचारों के लिए this question देखें।

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

+1

उदाहरण के लिए यदि मैंने 'क्लास एसेट {सार्वजनिक int आईडी {get; set;}} उत्पन्न किया था, तो मैं 'वर्ग एसेटवैप लिखूंगा: संपत्ति, INotifyPropertyChanged {public int idNotify {get {return id; } सेट {आईडी = मान; NotifyPropertyChanged();}}} 'यदि ऐसा है, तो ऐसा लगता है कि _very_ time-consuming। – Steve

+2

आमतौर पर व्यूमोडेल मॉडल से प्राप्त नहीं होता है, लेकिन इसके बजाय मॉडल ऑब्जेक्ट के साथ एक फ़ील्ड है, इसलिए 'क्लास एसेटवैप: INotifyPropertyChanged {Private Asset _asset; सार्वजनिक int idNotify {get {return _asset.id; } सेट {_asset.id = मान; NotifyPropertyChanged();}} '(यह काफी पूर्ण नहीं है)। और हां, कभी-कभी आप एमवीवीएम पैटर्न के साथ बहुत मेहनती बॉयलरप्लेट के साथ समाप्त होते हैं, लेकिन अगर आपको कुछ इंटरमीडिएट प्रोसेसिंग करने या मॉडल को प्रदर्शित करने के तरीके को बदलने की ज़रूरत है तो यह भुगतान करता है।मैंने एक और प्रश्न के लिए एक लिंक रखा है जिसमें इस वर्कलोड को कम करने के लिए कुछ विचार हैं। – WildCrustacean

+0

मैं एमवीवीएम का लाभ देख सकता हूं, लेकिन उन्हें वास्तव में कुछ एमवीवीएम जेनरेटर की आवश्यकता नहीं है, क्योंकि उनमें से बहुत सारे एक ही टेम्पलेट का पालन करते हैं। – Steve

5

मुझे हाल ही में ऐसा करने की आवश्यकता है लेकिन Winforms के साथ। यदि आप बीवीई द्वारा सुझाए गए एमवीवीएम पैटर्न का पालन नहीं करना चाहते हैं तो आप अपनी जेनरेट की गई इकाइयों पर अंकित IotifyProperty को लागू करने के लिए t4 टेम्पलेट को संशोधित कर सकते हैं।

इस उत्तर मुझे मदद मिली: https://stackoverflow.com/a/12192358/1914530

1

आप अपने गुणों पर PropertyChanged सामान, या (थोड़ा जोखिम भरा :)) उत्पन्न वर्गों संपादित करने के लिए उत्पन्न करने के लिए एफई टेम्पलेट (.tt फ़ाइल) संपादित कर सकते हैं। आखिरी थोड़ा जोखिम भरा है, क्योंकि यदि आप मॉडल को पुन: उत्पन्न करते हैं, तो सभी परिवर्तन खो जाएंगे। तो शायद रैपर वर्ग या टेम्पलेट संपादन (थोड़ा कठिन: एस) के साथ संस्करण सबसे अच्छा है।

1

PropertyChanged नामक एक NuGet पैकेज है। फोडी जो एक वर्ग गुणों को वास्तव में सरल में जोड़ता है IotifyProperty जोड़ता है। एक बार जब आप पैकेज स्थापित कर लेंगे तो किसी भी वर्ग या आंशिक वर्ग में [ImplementPropertyChanged] विशेषता जोड़ें और पैकेज आपके लिए INOTifyProperty को जोड़ देगा।

यहां इसका उपयोग करने का एक सरल उदाहरण है;

using PropertyChanged; 

[ImplementPropertyChanged] 
public partial class Order 
{ 
} 

अधिक जानकारी के लिए GitHub देखें।

0

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

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