विंडोज फॉर्म के लिए UI डिज़ाइन पैटर्न (WPF के लिए MVVM की तरह)


159

MVVM का उपयोग आमतौर पर WPF के साथ किया जाता है क्योंकि यह इसके लिए पूरी तरह से अनुकूल है। लेकिन विंडोज फॉर्म के बारे में क्या? क्या विंडोज फॉर्म के लिए भी इस तरह का एक स्थापित और आमतौर पर इस्तेमाल किया जाने वाला तरीका / डिजाइन पैटर्न है? एक जो विंडोज फॉर्म के साथ स्पष्ट रूप से अच्छी तरह से काम करता है? क्या कोई किताब या कोई लेख है जो इस बारे में अच्छी तरह बताता है? शायद एमवीपी या एमवीसी आधारित?



5
यह एक अच्छा सवाल लगता है। वोट और सितारे देखें ..
nawfal

13
यह कैसे रचनात्मक नहीं है जब यह बिल्कुल वही वार्तालाप है जिसे मैं खोज रहा था? मध्यम, हुक्म नहीं!
सीएडी

तो मूल रूप से, WinForms के लिए MVVM संभव है। लेकिन अधिकांश लोग इस बारे में बात करेंगे कि विन्फ़ॉर्म / एमवीवी विचार को आगे बढ़ाने के बजाय उन्होंने अतीत में एमवीपी / एमवीसी का उपयोग कैसे किया है। या वे इस बात पर ध्यान केंद्रित करते हैं कि यह वास्तव में प्रस्तुतकर्ता मॉडल नहीं है जिसे एमवीवीएम नहीं कहा जाता है, और WPF के लिए MVVM कितना प्यारा है।
एच। अब्राहम चावेज़

9
जब इस प्रकार के प्रश्न को "रचनात्मक नहीं" के रूप में बंद किया जाता है, तो मैं हमेशा निराश होता हूं, जैसा कि एक और पोस्टर ने पहले ही उल्लेख किया है, इस प्रकार की चर्चा ठीक वैसी ही है जैसी मैं यहां खोजता आया था। मॉडरेटर, कृपया अधिक उदार दृष्टिकोण अपनाएं और 'रचनात्मक नहीं' बटन पर क्लिक करें।
टिम लॉन्ग

जवाबों:


94

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

चुस्त सिद्धांत, पैटर्न, और प्रथाओं में सी # ...

आप स्रोत कोड पर स्रोत कोड प्राप्त कर सकते हैं

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

एमवीपी पैटर्न (ए) निष्क्रिय दृश्य और (बी) पर्यवेक्षण नियंत्रक के दो रूप हैं

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

मैं निम्नलिखित MVP फ्रेमवर्क MVC # - एक MVP फ्रेमवर्क पर एक नज़र रखने की सलाह दूंगा

नाम से मत जाना (यह एमवीपी ढांचा है)।

सरल winforms MVP वीडियो Winforms - MVP

ड्रॉपडाउन सूची एमवीपी - ड्रॉपडाउनलिस्ट से निपटने का एक उदाहरण

सरल ट्रीव्यू बाध्यकारी उदाहरण (गरीब आदमी का बंधन)। आप BindTree () में कोई ट्रीव्यू विशिष्ट तर्क जोड़ सकते हैं।

नीचे कोड स्निपेट है .... परीक्षण नहीं किया गया, सीधे विचार से निकाला गया ...।

public interface IYourView
{
   void BindTree(Model model);
}

public class YourView : System.Windows.Forms, IYourView
{
   private Presenter presenter;

   public YourView()
   {
      presenter = new YourPresenter(this);
   }

   public override OnLoad()
   {
         presenter.OnLoad();
   }

   public void BindTree(Model model)
   {
       // Binding logic goes here....
   }
}

public class YourPresenter
{
   private IYourView view;

   public YourPresenter(IYourView view)
   { 
       this.view = view;
   }

   public void OnLoad()
   {
       // Get data from service.... or whatever soruce
       Model model = service.GetData(...);
       view.BindTree(model);
   }
}

1
धन्यवाद, उस पुस्तक में उदाहरण मेरे स्वाद के लिए थोड़ा सरल है। मैं Winforms और MVP के बारे में अधिक जटिल डेटा डिस्प्ले जैसे कि TreeView या DataGridView के साथ कैसे जाऊंगा, कितना (क्या) लॉजिक कहां रहेगा?
बिटबैंक

bitbonk - मैंने उत्तर को अपडेट कर दिया है और जांच करूंगा कि क्या मुझे अधिक जानकारी मिल सकती है।
राजेश पिल्लई

1
BindTree विधि मुझे थोड़ी त्रुटिपूर्ण लगती है। अचानक दृश्य मॉडल को जानता है। क्या वह अच्छी चीज़ है? इस तरह की समस्याओं से सामना करने के लिए कई टन का कवच होना चाहिए। मुझे आश्चर्य है कि इसके बारे में कोई किताबें नहीं हैं। चूंकि .NET दुनिया में हर चीज के बारे में किताबें हैं।
बिटबोनक

1
यह कोई दोष नहीं है। यह एमवीपी पैटर्न का "सुपरवाइजरी कंट्रोलर" फ्लेवर है। सुपरवाइजर कंट्रोलर में, मॉडल के बारे में पता है (यह एक प्रेजेंटेशन मॉडल है)। दूसरा "पैसिव व्यू" है, जहां मॉडल से दृश्य पूरी तरह से डिकोड हो जाता है।
राजेश पिल्लई

14

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

यदि आप सब कुछ अच्छे तरीके से शुरू करना चाहते हैं, तो आपको स्मार्ट क्लाइंट के निर्माण के लिए रूपरेखा का उपयोग करना होगा। इसलिए मैं उस डिजाइन और प्रथाओं का उपयोग करने की सिफारिश करूंगा: स्मार्ट क्लाइंट सॉफ्टवेयर फैक्टरी http://www.codeplex.com/smartclient

आपके पास वर्तमान स्मार्ट क्लाइंट फ्रेमवर्क के बारे में यहां एक चर्चा है: http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

पुनश्च: मुझे एमवीपी विरोधी पैटर्न पर यह पोस्ट पसंद है: http://blog.mattwynne.net/2007/06/13/mvp-smells/

उम्मीद है की यह मदद करेगा


9

मॉडल-व्यू-ViewModel (MVVM) पैटर्न एक डिजाइन पैटर्न है। प्रति परिभाषा एक डिजाइन पैटर्न ऑब्जेक्ट-ओरिएंटेड दुनिया में एक सामान्य समाधान दिखाता है और इस समाधान को विभिन्न प्लेटफार्मों (WPF, WinForms, Java स्विंग, आदि) में लागू किया जा सकता है। मैं सहमत हूं कि MVVM का उपयोग WPF के साथ सबसे अच्छा किया जाता है क्योंकि यह मजबूत बाध्यकारी क्षमताओं का लाभ उठाता है। हालाँकि, Windows प्रपत्र डेटा बाइंडिंग का भी समर्थन करता है।

WAF विंडोज फॉर्म्स एडाप्टर से पता चलता है कि कैसे एक Windows Forms अनुप्रयोग में MVVM पैटर्न लागू करने के लिए।


3
WAF WPF के लिए है, न कि विंडोज फॉर्म के लिए। लिंक भ्रामक है।
बेंटले डेविस

2
लिंक भ्रामक नहीं है। WAF विंडोज फॉर्म एडाप्टर एक MVVM एप्लिकेशन के साथ आता है जिसे दो बार लागू किया जाता है: 1. WinForms; 2. WPF। दोनों एप्लिकेशन निचली परतों को साझा करते हैं जो UI तकनीक से स्वतंत्र हैं।
19

5

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

.NET Winforms के लिए MVVM

MVVM (मॉडल व्यू मॉडल देखें) डेटा बाइंडिंग (WPF) को सशक्त करने वाले वातावरण में डेटा से प्रस्तुति को अलग करने के लिए समान दृष्टिकोण का परिचय देता है। चूंकि .NET फ्रेमवर्क 2.0 पहले से ही उन्नत डेटा बाइंडिंग इन्फ्रास्ट्रक्चर प्रदान करता है जो एप्लिकेशन ऑब्जेक्ट के डिज़ाइन टाइम बाइंडिंग की भी अनुमति देता है - 'व्यू मॉडल' इकाई एमवीपी आधारित वातावरण में काफी अच्छी तरह से फिट हो सकती है।


4

मैंने अपने दो साथियों की सहकर्मियों से यही सवाल पूछा: क्या MVFM WindowsForms के लिए संभव है? दोनों ने मुझे एक ही जवाब दिया: " कोई रास्ता नहीं! WindowsForms WPF और सिल्वरलाइट (OneTime, OneWay, TwoWay, OnewayToSource) के समृद्ध बाइंडिंग को याद नहीं कर रहा है और यह टाइपकास्टर्स को भी याद कर रहा है ।"

  • WindowsForms के लिए स्क्रीन एक्टीवेटर पैटर्न - आप इसे यहाँ पा सकते हैं , जिसे कलिबर्न से बनाया गया है
  • रिच बाइंडिंग और टाइपकॉनवर्टर - केंट बोगार्ट द्वारा ट्रस , यह एक यूआई स्वतंत्र तरीके से करता है
  • कमांड्स - WPF एप्लीकेशन फ्रेमवर्क (WAF) में एक WafWinFormsAdapter प्रोजेक्ट होता है, जो कुछ MVVM वेयर कमांड का ध्यान रखता है।

फिर, क्या हम WinForms के लिए MVVM कर सकते हैं? हाँ हम कर सकते हैं। हमारे पास सभी टुकड़े हैं। हमें बस उन्हें एक साथ गोंद देना है।


4

मेरा मानना ​​है कि एमवीपी एक पैटर्न है जो कि WinForms के विकास के लिए अच्छी तरह से अनुकूल है - जैसा कि CAB में इसका उपयोग करके आंशिक रूप से इसका सबूत है - WinForms के लिए Microsoft का ढांचा।

मैं कोड को व्यू से बाहर निकालने के लिए WinForms में MVP का उपयोग करता हूं - क्योंकि मैं व्यू कोड का परीक्षण नहीं कर सकता। और उन कोड को भी सक्षम करने के लिए जिन्हें पुन: उपयोग करने की आवश्यकता है (या डुप्लिकेट किया गया है) दृश्य से बाहर रहने के लिए जहां इसे साझा नहीं किया जा सकता है।

मैं अपने स्वयं के प्रोजेक्ट का उल्लेख कर सकता हूं जहां मैं MVP पैटर्न ExceptionReporter.NET का उपयोग करता हूं । हालांकि मुझे यकीन है कि मैं इसका पूरी तरह से उपयोग नहीं करता हूं।

आपने WPF के लिए काम करने वाले MVVM का उल्लेख किया है - मुझे लगता है कि इसका कारण मजबूत डेटा-बाइंडिंग समर्थन है। यदि आप WPF में डेटा-बाइंडिंग का उपयोग नहीं कर रहे थे (और यह निश्चित रूप से अनिवार्य नहीं है) तो आप MVP चुन सकते हैं। बात यह है कि एमवीपी किसी भी क्लाइंट-साइड एप्लिकेशन के लिए एक मजबूत विकल्प है। और संभवतः 'बेहतर' विकल्प, WPF में भी, यदि आप उन परियोजनाओं के बीच कोड साझा करने की योजना बनाते हैं जो WPF नहीं हैं।

WinForms में MVP का उपयोग करने के मूल्य के और अधिक सबूतों के लिए, MVP का उपयोग करने पर Boodhoo की वीडियो प्रस्तुति देखें: http://www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodsoo-on-model http://msdn.microsoft.com/en-us/magazine/cc188690.aspx पर एक ही लेखक द्वारा साक्षात्कार-प्रस्तुतकर्ता और एक MSDN लेख


Boodhoo का सामान WebForms के बारे में प्रतीत होता है, WinForms के बारे में नहीं। जब तक वीडियो में अधिक सामान न हो ...?
रोजर लिप्सकॉम्ब

3

BindTree विधि मुझे थोड़ी त्रुटिपूर्ण लगती है। अचानक दृश्य मॉडल को जानता है। क्या वह अच्छी चीज़ है? इस तरह की समस्याओं से सामना करने के लिए कई टन का कवच होना चाहिए। मुझे आश्चर्य है कि इसके बारे में कोई किताबें नहीं हैं। चूंकि .NET दुनिया में हर चीज के बारे में किताबें हैं।

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

अब क्लास मॉडल राजेश द्वारा दिए गए उदाहरण में एक नाम का खराब विकल्प हो सकता है। यह ट्रीडाटा, या रिकार्डडाटा हो सकता है। हालाँकि आप इसे परिभाषित करते हैं, इसके पास अंतर्निहित डेटा के लिए एक विशिष्ट नियंत्रण को बांधने के लिए आपको Winforms के बाध्यकारी तंत्र का उपयोग करने की आवश्यकता है।

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

इस कुंजी के लिए फिर से इंटरफेस का उपयोग यह परिभाषित करना है कि प्रत्येक परत एक दूसरे के साथ कैसे संपर्क करती है।

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

  • फॉर्म को लागू करने वाले इंटरफेस
  • यूआईडीएलएल व्यू इंटरफेस को लागू करने वाले विचारों के साथ, जो फॉर्म इंटरफेस के माध्यम से रूपों के साथ बातचीत करते हैं। विशिष्ट विचार UIViewDLL व्यू के साथ खुद को पंजीकृत करते हैं, कमांड लाइब्रेरी में पाए जाने वाले कमांड ऑब्जेक्ट्स को निष्पादित करते हैं जो मॉडल के साथ बातचीत करते हैं।
  • कमांड लाइब्रेरी; ICommand को लागू करने वाले आदेशों की सूची। यूआईवाईडीडीएलएल में उजागर किए गए इंटरफेस के माध्यम से विचारों के साथ बातचीत करने वाली कमांड ऐसा करती है।
  • UIViewDLL; कमांड द्वारा उपयोग किए गए व्यू इंटरफेस को उजागर करता है।
  • नमूना; कक्षाएं और संग्रह जो मेरे आवेदन के मुख्य डेटा संरचनाओं को बनाते हैं। मेरे लिए ये मटेरियल, कटिंग, शेप, शीट, टॉर्च आदि जैसी चीजें हैं।
  • उपयोगिता; एक डीएलएल जो आमतौर पर मेरी कंपनी द्वारा उपयोग किए जाने वाले उपयोगिता वर्गों का उपयोग करता है जो अलग-अलग एप्लिकेशन का उपयोग करते हैं। उदाहरण के लिए जटिल गणित कार्य।

3

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

सामान्य मार्गदर्शन के तहत .NET के लिए एप्लिकेशन आर्किटेक्चर है: एप्लिकेशन और सेवाएं डिजाइन करना , जो कि .NET तरीकों और स्तरित एन-टियर एप्लिकेशन का एक अच्छा परिचय है।

alt text http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif

अधिक औपचारिक "पैटर्न" के लिए, Microsoft .NET का उपयोग करके एंटरप्राइज सॉल्यूशन पैटर्न है(स्रोत: microsoft.com )वैकल्पिक शब्द

कुछ नाम है,


2

मैंने जो UI डिज़ाइन पैटर्न पढ़ा, उसका पहला अच्छा विवरण जेरेमी मिलर के ब्लॉग - बिल्डिंग योर ओन कैब में था । यह सामान्य पैटर्न - पैसिव व्यू, एमवीपी इत्यादि का वर्णन करता है और कुछ तरीकों को संबोधित करता है जिन्हें आप C # में लागू कर सकते हैं।


1

आप मुगनमेनवमूलकिट की कोशिश कर सकते हैं जो WinForms के लिए "शुद्ध MVVM" का उपयोग करने की अनुमति देता है। इस तथ्य के कारण कि यह सभी प्लेटफार्मों पर बाइंडिंग का समर्थन करता है, सभी सभी प्लेटफार्मों पर उपलब्ध WPF प्लेटफॉर्म के लिए देशी बाध्यकारी सुविधाओं के सभी (WinForms शामिल हैं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.