2009-04-23 9 views
7

मैं सिर्फ डब्ल्यूपीएफ में एमवीवीएम पैटर्न के साथ शुरुआत कर रहा हूं और मैंने फैसला किया कि मेरे कोड को ढांचाने का सबसे शानदार तरीका दृश्य-निर्माता को व्यू-कन्स्ट्रक्टर में इंजेक्शन दे रहा था।एमवीवीएम - क्या दृश्य को वास्तव में एक डिफ़ॉल्ट कन्स्ट्रक्टर होना चाहिए?

यह सब ठीक है और अच्छा है, लेकिन रीशेपर XAML में एक चेतावनी देता है कि मेरे दृश्य में डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है। मुझे लगता है कि ऐसा इसलिए है कि यदि आवश्यक हो तो मैं एक्सएएमएल में अपना विचार बना सकता हूं, लेकिन यह केवल एक अनुमान है।

मैं कन्स्ट्रक्टर में दृश्य-मॉडल लेने के लिए अपने विचार की आवश्यकता के द्वारा क्या छोड़ रहा हूं?

संपादित करें: मेरा विचार निर्माता इस तरह दिखता है:

public ExampleView(ExampleViewModel viewModel) 
{ 
    if (viewModel == null) throw new ArgumentNullException("viewModel"); 
    DataContext = viewModel; 
} 

उत्तर: मैं इसे जारी रखते हुए जहां DesignTime नाम स्थान परीक्षण और डिजाइन समय के लिए ViewModel के संस्करणों मज़ाक उड़ाया शामिल की स्थापना की, बस गए समर्थन।

ExampleView.xaml.cs

public ExampleView() 
{ 
    InitializeComponent(); 
} 

public ExampleView(IExampleViewModel viewModel) 
    : this() 
{ 
    DataContext = viewModel; 
} 

ExampleView.xaml

<UserControl 
    x:Class="Wpf.Examples.ExampleView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:DesignTime="clr-namespace:Wpf.Examples.DesignTime"> 

    <UserControl.DataContext> 
     <DesignTime:ExampleViewModel/> 
    </UserControl.DataContext> 

</UserControl> 

उत्तर

8

जैसा कि आपने सही ढंग से पहचाना है, एक गैर-डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता है जो आपको XAML से उस नियंत्रण का उपयोग करने से इनकार कर देगा। इसका मतलब यह भी नहीं है कि कोई और डिजाइन-समर्थन नहीं है और आपके डिजाइनर शायद आपको नफरत करेंगे। अंत में आप अच्छे डेटा बाध्यकारी परिदृश्यों के सभी प्रकार तोड़ते हैं। ItemTemplate के रूप में नियंत्रण का उपयोग करने की तरह।

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

लापता बाध्यकारी समर्थन डेटा के लिए एक उपाय के रूप में, आप विचार करना चाहिए कि क्या यह आपके WPF नियंत्रण के DataContext के माध्यम से देखने के मॉडल का उपभोग करने के लिए बेहतर हो सकता है। यह WPF और --- जहां तक ​​मैं बता सकता हूं --- WPF में दृश्य को मॉडल को पास करने का इच्छित तरीका है।

+0

मैं कन्स्ट्रक्टर में डेटाकॉन्टेक्स्ट को वैसे भी सेट कर रहा हूं, क्या इसके लिए एक बेहतर पैटर्न है? –

+1

फैक्टरी का प्रयोग करें? डेटाकॉन्टेक्स्ट मैन्युअल रूप से सेट करें? एक खाली डिफ़ॉल्ट कन्स्ट्रक्टर बनाएँ? –

0

यह मानते हुए कि आप डिजाइनर समर्थन की जरूरत नहीं है तो मुझे कोई कारण देखें।

0

डिजाइनर समर्थन रखने के लिए आपको एक डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता है। जब आप अपना खुद का कन्स्ट्रक्टर परिभाषित करते हैं तो आप मूल रूप से स्वत: उत्पन्न डिज़ाइनर को खो देते हैं। बस एक स्पष्ट डिफ़ॉल्ट कन्स्ट्रक्टर बनाएं और आपको ठीक होना चाहिए।

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