2012-09-10 21 views
5

मैं एमवीवीएम के लिए मामूली नया हूं और मैं xaml के पीछे सरल कोड पर एमवीवीएम के कुछ लाभों को समझता हूं (उदाहरण के लिए वीएम की टेस्टेबिलिटी)। हम कुछ बाध्यकारी करने के लिए कैलिबर्न माइक्रो का उपयोग कर रहे हैं लेकिन यह अप्रासंगिक है, मैं विशिष्ट बाध्यकारी {बाध्यकारी ...} का उपयोग कर सकता हूं और मेरा प्रश्न उतना ही कम रहेगा।बाइंडिंग की समय जांच संकलित करें?

मैं तर्क समझता हूं कि वीएम को वी के कुछ भी नहीं पता होना चाहिए अगर सबकुछ ठीक से किया जाता है, लेकिन ऐसा लगता है कि हम वी और वीएम के बीच गतिशील रन टाइम बाध्यकारी का उपयोग कर रहे हैं कि संकलक पर कोई जांच नहीं कर सकता प्रत्येक बाध्यकारी अभिव्यक्ति की वैधता। उदाहरण के लिए यदि मेरे पास उपयोगकर्ता नाम नामक यूआई घटक है तो कैलिबर्न उस समय VM प्रॉपर्टी को बाध्य करने का प्रयास करेगा जिसे उपयोगकर्ता नाम को रन टाइम पर (वैल्यू = "{बाइंडिंग उपयोगकर्ता नाम}" जैसा कुछ करने के समान होगा)। हालांकि अगर मैं अपनी वीएम संपत्ति का नाम बदलता हूं या यूआई घटक नाम या बाध्यकारी अभिव्यक्ति को गलत वर्तनी देता हूं तो हमें रन टाइम तक किसी समस्या का कोई संकेत नहीं मिलता है।

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

क्या xaml को बताने का कोई तरीका है कि हम किसी इंटरफ़ेस या ऑब्जेक्ट प्रकार से बाध्यकारी हैं? क्या कोई ऐसा उपकरण है जो बाइंडिंग को मान्य करने के लिए xaml एप्लिकेशन में प्लग कर सकता है?

उत्तर

4

संकलक XAML का संकलन समय जांच के लिए सहायता प्रदान नहीं करता है, तो आप शायद बहुत ही परिणाम एक कस्टम निर्माण कार्य कि XAMLReader वर्ग के माध्यम से एक XAML फाइल को दर्शाता है लेखन, और उसके बाद के लिए सुनने के लिए एक custom TraceListener का उपयोग करके प्राप्त कर सकते हैं बाध्यकारी त्रुटियां।

इसके अलावा, यदि आप कोड का उपयोग करके अपना डाटाबेसिंग करने के लिए तैयार हैं, तो आप बाइंडिंग बना सकते हैं जो सीधे संपत्ति नामों का संदर्भ लेते हैं। निम्नलिखित (untested) की तरह कुछ

Binding createBinding<TProperty>(Expression<Func<TProperty>> property, object source) 
{ 
    MemberExpression me = property.Body as MemberExpression; 
    if (me == null || me.Expression != property.Parameters[0] 
      || me.Member.MemberType != MemberTypes.Property) { 
     throw new InvalidOperationException(
      "Now tell me about the property"); 
    } 
    Binding b = new Binding(me.Member.Name); 
    b.Source = source; 

    return b; 
} 

// sample code 
Binding b = createBinding(()=>this.FontSize, this); 
textBlock1.SetBinding(TextBlock.FontSizeProperty, b); 
-1

आप आसानी से जांच सकते हैं कि रनटाइम पर आउटपुट विंडो में बाध्यकारी त्रुटियों की तलाश करके आपकी कोई भी बाइंडिंग विफल रही है या नहीं। आपको वर्बोज़ को बाध्य करने के लिए डिबगिंग जानकारी सेट करने की आवश्यकता हो सकती है।

+0

-1: ओपी ने संकलन समय पर एक समाधान के लिए स्पष्ट रूप से पूछा। –

+0

आह ... यह एक विकल्प है –

+3

यह नहीं है। ओपी पहले से ही इस बारे में जानता है और इसका उपयोग नहीं करना चाहता। –

2

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

Performance impact of Wpf Binding Path={x:Static <propertypath>}?

0

आप पूछ "वहाँ कुछ उपकरण है जो एक XAML आवेदन में प्लग कर सकते हैं बाइंडिंग को मान्य करने के है?"।

हां, आप रनटाइम पर खराब बाइंडिंग का पता लगाने के लिए Snoop का उपयोग कर सकते हैं। यह समय संकलित नहीं है - लेकिन यह उतना ही प्रभावी है।

पूर्ण निर्देशों के लिए, Solution 8 पर ReSharper WPF error: "Cannot resolve symbol "MyVariable" due to unknown DataContext" पर देखें।