2009-12-10 14 views
13

मैं WPF आधारित एप्लिकेशन पर काम कर रहा हूं। पर्यावरण वीएस -2008 एसपी 1 है .NET 3.5 एसपी 1. हमारे विकास में हम व्यापक रूप से एमवीवीएम पैटर्न का उपयोग कर रहे हैं।संकलन समय में XAML में डेटा बाइंडिंग मान्य करें

आईई। एप्लिकेशन डेवलपर्स मॉडल और व्यू मॉडल्स (सी #) लिखते हैं, फिर यूआई डेवलपर WPF बाइंडिंग (एक्सएएमएल) का उपयोग करके दृश्य लिखेंगे। एप्लिकेशन डेवलपर्स ViewModels के शीर्ष पर इकाई परीक्षण भी लिखते हैं। हम निरंतर एकीकरण पद्धति का उपयोग कर रहे हैं और हम प्रत्येक संशोधन

पर यूनियन परीक्षण का निर्माण और निष्पादन कर रहे हैं समस्या XAML में डेटा बाध्यकारी शुद्धता सत्यापन की प्रक्रिया या उपकरण की कमी है। उदाहरण के लिए:

  1. एप्लिकेशन डेवलपर संपत्ति NmberOfApples और इकाई परीक्षण
  2. यूआई डेवलपर उपयोगकर्ता नियंत्रण बनाता है इसकी सही व्यवहार की जाँच करें और संपत्ति के लिए यह बाँध के लिए लिखते हैं
  3. एप्लिकेशन डेवलपर पता चलता है कि संपत्ति की गलत वर्तनी है और NumberOfApples के लिए इसका नाम तय
  4. में किसी भी सी # कोड NmberOfApples संपत्ति का उपयोग करता है यह संकलन समय त्रुटियों होगा, और ऐसी त्रुटियों ख होगा ई पकड़ने के लिए आसान (सतत एकीकरण)
  5. डाटा XAML फ़ाइलों में बाध्यकारी नहीं जा रहे हैं मान्य करने की और यह समय त्रुटि चलाया जाएगा

मेरा प्रश्न हो जाएगा "वहाँ किसी भी उपकरण या कार्यप्रणाली कि मदद हमें मान्य है संकलन समय में XAML में डेटा बाध्यकारी शुद्धता? "

+0

मुझे पता चला है कि मैंने आपके प्रश्न का डुप्लिकेट पोस्ट किया है। :( http: // stackoverflow।कॉम/प्रश्न/43208011/डिटेक्ट-इन-एक्सएएमएल-टूटा-बाइंडिंग-पहले से ही संकलन-समय लेकिन मैं इस पर एक अच्छा समाधान बन गया हूं! मैं यहां एक समाधान पोस्ट नहीं करूंगा, क्योंकि यह मुझसे नहीं है और अन्यथा यह चोरी चोरी होगी। – Rekshino

उत्तर

9

आपकी समस्या का समाधान इस article में चर्चा की गई है।

मूल विचार स्थिर (सी #) वर्गों के व्यूमोडेल मेटाडाटा सेट को बनाना है जो आपके व्यूमोडेल कक्षाओं के गुणों का स्ट्रिंग मान रखता है जिसे आप अपने xaml में उपयोग कर सकते हैं। आलेख बताता है कि इन स्थिर मेटाडेटा कक्षाओं को बनाने के लिए टी 4 टेक्स्ट पीढ़ी का उपयोग कैसे करें। आप अपनी वरीयता के किसी कोड जनरेशन टूल का उपयोग कर सकते हैं।

तो अपने वीएम है निम्नलिखित:

namespace Mine 
{ 
    public class MyViewModel 
    { 
    public int MyInt {get;set;} 
    public string MyString {get;set;} 
    } 
} 

और आप कोड पीढ़ी इस बनाना होगा:

namespace Mine.MetaData 
{ 
    public static class MyViewModelMetaData 
    { 
    public const string MyInt = "MyInt"; 
    public const string MyString = "MyString"; 
    } 
} 

और फिर अपने XAML में आप अपने XAML करने के लिए नाम स्थान जोड़ना होगा और अपने नियंत्रण के लिए बाध्य मेटाडाटा वर्ग के लिए

<TextBox Text="{Binding Path={x:Static Metadata:MyViewModelMetadata.MyInt}}"/> 

आपकी तरह में ऐड-एक का उपयोग करते हैंतो यह आपको स्थैतिक वर्ग के गुणों पर इंटेलिजेंस देगा और यह भी कि क्योंकि आप स्थैतिक वर्ग में एक सटीक संपत्ति का संदर्भ दे रहे हैं, जब स्थैतिक वर्ग पुन: उत्पन्न हो जाता है तो आपका xaml संकलित नहीं होना चाहिए।

यह बहुत चालाक है, मुझे लगता है कि यह बहुत ही बढ़िया है और इसमें अधिकांश लोगों को सचेत रखने का मौका है, लेकिन आपका माइलेज भिन्न हो सकता है। :)

संपादित करें:

वैसे, मैं नहीं खरीद "ViewModels कसकर करने के लिए दृश्य मिलकर कर रहे हैं" है। मेरी राय में दृश्य उनके व्यू मॉडल्स के लिए अनजाने में बाध्य हैं, लेकिन यह केवल एक ही तरीका होना चाहिए। ViewModels किसी भी दृश्य कार्यान्वयन से पूरी तरह से स्वतंत्र होना चाहिए। ऐसा लगता है कि व्यूमोडेल इंटरफ़ेस है और दृश्य कंक्रीट लागू कक्षा है। इसलिए इस कारण से मैं अपने व्यूमोडेल में किसी भी WPF- विशिष्ट गुणों (उदा। दृश्यता गणना) में नहीं डालता क्योंकि यह मुझे अनंत काल के लिए WPF का उपयोग करने के लिए बाध्य करता है (जो वास्तव में एक बुरी चीज नहीं है :)), लेकिन यह रखरखाव से समझौता करता है।

+1

यह एक महान दृष्टिकोण है, इसे इंगित करने के लिए धन्यवाद। मैं इस प्रश्न को दो और दिनों के लिए अनुत्तरित रखने जा रहा हूं, बस अगर कोई अन्य चाल साझा करना चाहेगा। –

+0

@ जोस यदि आप दृश्य मॉडल में "दृश्यता" जैसे गुण नहीं रखते हैं, तो आप UI घटक की दृश्यता कैसे बदलते हैं क्योंकि आप XAML के अंदर सशर्त तर्क एम्बेड नहीं कर सकते हैं? –

1

कई तर्कसंगत अच्छे परिदृश्य हैं जहां यह व्यवहार वास्तव में वांछित है। किसी भी मामले में, यह डिज़ाइन द्वारा किया जाता है कि बाइंडिंग त्रुटियों को निगलती है और यही वजह है कि आपको कुछ भी ढूंढने में परेशानी होगी जो इससे आपकी मदद करेगा।

सबसे अच्छी बात मैंने देखा है एक अपवाद सत्यापन हैंडलर कि बाध्यकारी त्रुटियों को प्रदर्शित करेगा है: http://msdn.microsoft.com/en-us/library/system.windows.controls.exceptionvalidationrule.aspx

इस के लिए तर्क विचारों और ViewModels बिंदु है जहां एक दृश्य इस्तेमाल किया जा सकता करने के लिए decoupled किया जा के लिए होती हैं एकाधिक ViewModels के लिए। यह विचारों की "बंधनशीलता" में भी सहायता करता है ताकि सैद्धांतिक रूप से डिजाइनर प्रकार त्रुटियों के गुच्छा में चलने के बिना एक दृश्य शैली बना सकें। मुझे एहसास है कि यह आपकी प्रक्रिया के साथ फिट नहीं हो सकता है, लेकिन यह कहानी है।

+0

मुझे पता है कि यह देखने के लिए अच्छा है और ViewModel decoupled। यहां प्रश्न, मैं उनकी "संगतता" को कैसे सत्यापित कर सकता हूं। –

+0

हाँ ... मुझे पता है कि आपका प्रश्न था। वह "तर्कसंगत" था। दुर्भाग्यवश मुझे लगता है कि आपको उस अपवाद ValidationRule संभवतः और स्वचालित UI परीक्षणों पर ध्यान केंद्रित करना होगा। मुझे पता है कि थोड़ा सा गड़बड़ है। –

-1

मैं पिछले उत्तर से सहमत हूं। यह "डिजाइन द्वारा" है और संकलन समय पर इसे जांचने का कोई तरीका नहीं है।

मुझे यह भी दर्द मिला है।

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

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

+0

क्या आप मैन्युअल रूप से सभी एप्लिकेशन विंडो पर चलने का सुझाव दे रहे हैं? –

0

वर्तमान में हम Caliburn का उपयोग कर रहे हैं और इस आलेख में वर्णित तरीके से यूनिट परीक्षण Testing Bindings In WPF।इस समाधान की कमी, यूआई डेवलपर कोड लिखता है जिसका मतलब केवल बाइंडिंग को सत्यापित करना है और एमएस (या कोई) XAML सत्यापन संकलक लिखने पर छोड़ा जा सकता है।

2

यदि आप ReSharper इंस्टॉल करते हैं, तो आपको (कोड) सुविधाओं में से एक "कोड निरीक्षण" प्राप्त होगा। इस निरीक्षण का पता लगाने वाली चीजों में से एक वह मामला है जहां आपका बाध्यकारी आपके डेटा संदर्भ पर किसी संपत्ति का समाधान नहीं करता है। आप केवल इन समस्याओं को दिखाने के लिए "निरीक्षण परिणाम" विंडो को आसानी से फ़िल्टर कर सकते हैं।

ध्यान दें कि काम करने के लिए आपको अपने एक्सएएमएल संसाधनों में स्पष्ट रूप से अपने दृश्य मॉडल के प्रकार को अवश्य बता देना चाहिए।

Example of ReSharper inspections

1

यह वर्षों के बाद से मूल प्रश्न पूछा गया था और जवाब लेकिन जैसा कि मैंने अभी जाँच की, समाधान तब से सरल मिल गया है हो सकता है हो गया है। ReSharper स्वीकार किए गए उत्तर में वर्णित स्थैतिक वर्गों को उत्पन्न करने की आवश्यकता के बिना सही इंटेलिजेंस प्रदान करता प्रतीत होता है।

लेकिन मैंने स्वीकार्य उत्तर में बताए गए संकलन-समय त्रुटि को नहीं देखा है। मैंने किसी भी लाभ के लिए [XamlCompilation (XamlCompilationOptions.Compile)] का उपयोग करने का भी प्रयास किया। अगर मुझे कुछ याद आ रहा है तो कृपया मुझे सही करें।

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