2013-02-08 12 views
10

के साथ WPF डिज़ाइन डेटा का उपयोग करके मैं व्यापक WP परीक्षण के लिए हमारे WPF अनुप्रयोग में एमवीवीएम पैटर्न का उपयोग कर रहा हूं। एमवीवीएम पैटर्न स्वयं बहुत अच्छा काम कर रहा है, हालांकि मैं पैटर्न को इस तरह अनुकूलित करने के लिए संघर्ष कर रहा हूं जिसका मतलब है कि मैं डब्ल्यूपीएफ के डिजाइन-टाइम डेटा सपोर्ट का उपयोग कर सकता हूं।एमवीवीएम पैटर्न

जैसा कि मैंने प्रिज्म उपयोग कर रहा हूँ ViewModel उदाहरणों आम तौर पर की तरह तो ViewModel के लिए

public MyView(MyViewModel viewModel) 
{ 
    DataContext = viewModel; 
} 

निर्भरता तो निर्माता में इंजेक्ट किया जाता है, देखने के निर्माता में इंजेक्ट किया जाता है, ताकि

public class MyViewModel 
{ 
    public MyViewModel(IFoo foo, IBar bar) 
    { 
     // ... 
    } 

    // Gets and sets the model represented in the view 
    public MyModel { get; set; } 

    // Read-only properties that the view data binds to 
    public ICollectionView Rows { get; } 
    public string Title { get; } 

    // Read-write properties are databound to the UI and are used to control logic 
    public string Filter { get; set; } 
} 
की तरह

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

public class MyViewModel 
{ 
    public MyViewModel() 
    { 
    } 

    public MyViewModel(IFoo foo, IBar bar) 
    { 
     // ... 
    } 

    // Gets and sets the model represented in the view 
    public MyModel { get; set; } 

    // My read-only properties are no longer read-only 
    public ObservableCollection<Something> Rows { get; } 
    public string Title { get; set; } 

    public string Filter { get; set; } 
} 

यह मैं चिंता है:

  • मैं एक parameterless निर्माता है कि कहा जा करने का इरादा कभी नहीं और है नहीं इकाई का परीक्षण किया
  • संपत्तियों के लिए setters हैं कि केवल ViewModel ही चाहिए
  • मेरा व्यूमोडेल अब गुणों का एक झुका हुआ मिश्रण है जिसे दृश्य द्वारा संशोधित किया जाना चाहिए, और जो नहीं करना चाहिए - इससे यह एक नज़र में बताने में मुश्किल हो जाती है कि किसी भी दिए गए गुण को बनाए रखने के लिए कोड का टुकड़ा ज़िम्मेदार है
  • डिज़ाइन समय पर कुछ गुण सेट करना (उदा। Filter पाठ पर स्टाइल देखने के लिए) वास्तव में ViewModel तर्क का आह्वान कर सकते हैं!

(तो मेरे ViewModel भी डिजाइन समय में लापता जा रहा है अन्यथा अनिवार्य निर्भरता tollerant करने की आवश्यकता है) वहाँ एक रास्ता है कि समझौता नहीं करता है में एक WPF MVVM आवेदन में डिजाइन समय डेटा प्राप्त करने के लिए एक बेहतर तरीका है मेरी इस तरह से ViewModel?

वैकल्पिक रूप से मुझे अपना व्यूमोडेल अलग-अलग बनाना चाहिए ताकि इसमें कहीं और अलग तर्क के साथ अधिक सरल गुण हो।

उत्तर

-1

मैंने भी डब्ल्यूपीएफ और एमवीवीएम कार्यान्वयन के साथ एनयूनीट परीक्षण के साथ काम किया है। हालांकि, मेरा संस्करण आपके से उलट है। आप पहले दृश्य बना रहे हैं, फिर इसे नियंत्रित करने के लिए मॉडल बना रहे हैं।

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

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

public class MyMVVMBase 
{ 
    private MyViewBaseline currentView; 

    public MyMVVMBase() 
    { // no parameters required } 

    public virtual void GetTheViewWindow() 
    { throw new exception("You need to define the window to get";) } 
} 

public class MyXYZInstanceModel : MyMVVMBase 
{ 
    public override void GetTheViewWindow() 
    { 
     currentView = new YourActualViewWindow(); 
    } 
} 

आशा है कि यह आपके द्वारा चलाए जा रहे विकल्पों के विकल्प के रूप में मदद करता है।

+2

यह मेरे लिए थोड़ा अजीब बात है कि आपके वीएम के बाद आपके विचारों पर निर्भरता है। –

+0

@ ग्रेगडी, मेरे लिए नहीं। मुझे यह मॉडल प्राप्त करने में सक्षम होना चाहिए कि मैं डेटा पूछताछ कर सकता हूं, गेटर्स/सेटर्स को उजागर करके किसी भी बाहरी "दृश्य" को प्रस्तुत किए जा सकने वाले झंडे सेट कर सकता हूं। मैं बस इतना कह रहा हूं कि इस उदाहरण में, इसे दृश्य की आवश्यकता नहीं है, लेकिन अगर मैं एक लॉन्च करना चाहता हूं, तो प्रत्येक व्यू मॉडल का अपना उद्देश्य है, जैसे रखरखाव स्क्रीन, लेनदेन हेडर/विस्तार प्रसंस्करण, जो भी हो। यदि कोई प्रासंगिक दृश्य है, तो मेरे पास सिर्फ हुक कहना है ... इस एमवीवीएम हैंडलर से जुड़े दृश्य को कॉल करें। – DRapp

+0

तो इस दृष्टिकोण के साथ डिज़ाइन-टाइम डेटा कैसे काम करता है? – Justin

1

सबसे पहले, मैं आपको this video पर एक नज़र डालने की सलाह दूंगा जहां ब्रायन लागुनास एमवीवीएम के बारे में कई सर्वोत्तम प्रथाएं प्रदान करता है। ब्रायन - कम से कम - प्रिज्म के विकास में शामिल है, क्योंकि उसका नाम nuget पैकेज जानकारी में प्रकट होता है। आगे की जांच नहीं की।

मेरी तरफ मैं केवल प्रिज्म के टुकड़े का उपयोग करें, और मेरे मॉडल और ViewModel हमेशा खाली कंस्ट्रक्टर्स की पेशकश (जैसे क्या ब्रायन से पता चलता), डेटा संदर्भ दृश्य के XAML में असाइन किया गया है, और मैं जैसे गुण मान सेट:

<MyView.DataContext> 
    <MyViewModel /> 
</MyView.DataContext> 

और

public void BringSomethingNew() 
{  
    var myView = new View(); 
    (myView.DataContext as ViewModel).Model = myModel; 

    UseMyView(); 
} 

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

साथ setters के संबंध में, डिजाइन डेटा अभी भी, अगर आप उन्हें निजी बनाने के लिए काम करेंगे की तरह:

public string MyProp { get; private set; } 

ठीक है, अपनी सुविधानुसार NotifyPropertyChange प्रबंधन करने के लिए इसे अनुकूलित, लेकिन आप विचार मिल गया है।

अब, मेरे पास अभी तक ObesrvableCollection एस का प्रबंधन करने का कोई समाधान नहीं है (मुझे एक ही समस्या का सामना करना पड़ रहा है, हालांकि XAML में कई मान डालना कभी-कभी काम करता है ... ???), और हाँ, मैं मानता हूं कि आपको करना है गुणों को सेट करते समय केस प्रबंधित करें, जैसे कि कन्स्ट्रक्टर में डिफ़ॉल्ट मान सेट करना।

मुझे उम्मीद है कि इससे मदद मिलती है।

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