दूसरा, एक दृश्य हमेशा प्रस्तुतकर्ता द्वारा नियंत्रित किया जाता है। ऐसे प्रस्तुतकर्ता के कानून, व्यवहार और विशेषताओं का वर्णन इंटरफ़ेस द्वारा भी किया गया है। उस इंटरफ़ेस को ठोस दृश्य कार्यान्वयन में कोई रूचि नहीं है जब तक कि यह इसके दृश्य इंटरफ़ेस के नियमों का पालन करता है।
तीसरा, क्योंकि प्रेजेंटर अपने विचार को नियंत्रित करता है, निर्भरताओं को कम करने के लिए वास्तव में इसके प्रस्तुतकर्ता के बारे में कुछ भी जानने में कोई लाभ नहीं होता है। प्रस्तुतकर्ता और दृश्य के बीच एक सहमति अनुबंध है और यह दृश्य इंटरफ़ेस द्वारा कहा गया है।
तीसरा के निहितार्थ हैं:
- प्रस्तोता किसी भी तरीके कि दृश्य कॉल कर सकते हैं नहीं है, लेकिन घटनाएँ देखें कि प्रस्तोता की सदस्यता ले सकते हैं।
- प्रस्तुतकर्ता अपना विचार जानता है। मैं कंक्रीट प्रस्तुति पर कन्स्ट्रक्टर इंजेक्शन के साथ इसे पूरा करना पसंद करता हूं।
- दृश्य को पता नहीं है कि प्रस्तुतकर्ता इसे नियंत्रित कर रहा है; यह किसी भी प्रस्तुतकर्ता को कभी प्रदान नहीं किया जाएगा।
आपकी समस्या के लिए, ऊपर कुछ हद तक सरल कोड में ऐसा दिखाई दे सकता:
interface IConfigurationView
{
event EventHandler SelectConfigurationFile;
void SetConfigurationFile(string fullPath);
void Show();
}
class ConfigurationView : IConfigurationView
{
Form form;
Button selectConfigurationFileButton;
Label fullPathLabel;
public event EventHandler SelectConfigurationFile;
public ConfigurationView()
{
// UI initialization.
this.selectConfigurationFileButton.Click += delegate
{
var Handler = this.SelectConfigurationFile;
if (Handler != null)
{
Handler(this, EventArgs.Empty);
}
};
}
public void SetConfigurationFile(string fullPath)
{
this.fullPathLabel.Text = fullPath;
}
public void Show()
{
this.form.ShowDialog();
}
}
interface IConfigurationPresenter
{
void ShowView();
}
class ConfigurationPresenter : IConfigurationPresenter
{
Configuration configuration = new Configuration();
IConfigurationView view;
public ConfigurationPresenter(IConfigurationView view)
{
this.view = view;
this.view.SelectConfigurationFile += delegate
{
// The ISelectFilePresenter and ISelectFileView behaviors
// are implicit here, but in a WinForms case, a call to
// OpenFileDialog wouldn't be too far fetched...
var selectFilePresenter = Gimme.The<ISelectFilePresenter>();
selectFilePresenter.ShowView();
this.configuration.FullPath = selectFilePresenter.FullPath;
this.view.SetConfigurationFile(this.configuration.FullPath);
};
}
public void ShowView()
{
this.view.SetConfigurationFile(this.configuration.FullPath);
this.view.Show();
}
}
उपरोक्त के अतिरिक्त, मैं आमतौर पर एक आधार IView
इंटरफ़ेस मैं कहाँ Show()
भी छिपा सकते हैं और किसी भी मालिक दृश्य है या शीर्षक देखें जो मेरे विचारों से आम तौर पर लाभान्वित होता है।
आपके प्रश्नों के लिए:
1.WinForm लोड हो जाए, यह एक treeview प्राप्त करने के लिए है जब। क्या मैं यह सोचने में सही हूं कि दृश्य को एक विधि जैसे कि presenter.gettree() को कॉल करना चाहिए, यह बदले में मॉडल को प्रतिनिधि करेगा, जो वृक्षदृश्य के लिए डेटा प्राप्त करेगा, इसे बनाएगा और इसे कॉन्फ़िगर करेगा, इसे वापस लौटाएगा प्रेजेंटर, जो बदले में दृश्य को पास करेगा जो तब इसे एक पैनल कहने के लिए असाइन करेगा?
मैं सही IConfigurationView.Show()
2.को कॉल करने से पहले IConfigurationPresenter.ShowView()
से IConfigurationView.SetTreeData(...)
कहेंगे, इस Winform पर कोई डेटा नियंत्रण के लिए एक ही होगा, के रूप में मैं भी एक DataGridView है ?
हां, मैं इसके लिए IConfigurationView.SetTableData(...)
पर कॉल करूंगा। यह दिए गए डेटा को प्रारूपित करने के लिए दृश्य पर निर्भर है। प्रस्तुतकर्ता बस दृश्य के अनुबंध का पालन करता है कि वह टैब्यूलर डेटा चाहता है।
3.मेरे अनुप्रयोग, एक ही विधानसभा के साथ मॉडल वर्गों की एक संख्या है। यह प्लगइन के साथ प्लगइन आर्किटेक्चर का भी समर्थन करता है जिसे स्टार्टअप पर लोड करने की आवश्यकता होती है। क्या दृश्य बस एक प्रस्तुतकर्ता विधि को कॉल करेगा, जो बदले में एक विधि को कॉल करेगा जो प्लगइन लोड करता है और जानकारी को दृश्य में प्रदर्शित करता है? फिर कौन सा स्तर प्लगइन संदर्भों को नियंत्रित करेगा। क्या दृश्य उनके या प्रस्तुतकर्ता के संदर्भ रखेगा?
यदि प्लगइन दृश्य-संबंधित हैं, तो विचारों को उनके बारे में पता होना चाहिए, लेकिन प्रस्तुतकर्ता नहीं। यदि वे सभी डेटा और मॉडल के बारे में हैं, तो दृश्य के साथ उनके साथ कुछ भी नहीं होना चाहिए।
4.एम आई, यह सोचकर कि दृश्य प्रस्तुति के बारे में हर एक बात को संभाल चाहिए datagrid आकार, आदि के लिए treeview नोड रंग से, में सही हूँ?
हां। इसके बारे में सोचें कि प्रस्तुतकर्ता एक्सएमएल प्रदान करता है जो डेटा और दृश्य का वर्णन करता है जो डेटा लेता है और इसे सीएसएस स्टाइलशीट लागू करता है। ठोस शब्दों में, प्रस्तुतकर्ता IRoadMapView.SetRoadCondition(RoadCondition.Slippery)
पर कॉल कर सकता है और दृश्य फिर लाल रंग में सड़क प्रस्तुत करता है।
क्लिक किए गए नोड्स के डेटा के बारे में क्या?
5.तो जब मैं TreeNodes पर क्लिक करें, मैं प्रस्तोता के लिए विशिष्ट नोड के माध्यम से पारित करना चाहिए और उसके बाद से है कि प्रस्तोता बाहर काम करेगा कि उसे किस डेटा की जरूरत है और फिर उस डेटा के लिए मॉडल पूछता है, इसे वापस देखने के लिए पेश करने से पहले?
यदि संभव हो, तो मैं एक शॉट में एक पेड़ को देखने के लिए आवश्यक सभी डेटा पास कर दूंगा। लेकिन अगर कुछ डेटा शुरुआत से पारित होने के लिए बहुत बड़ा है या यदि यह अपनी प्रकृति में गतिशील है और मॉडल (प्रस्तुतकर्ता के माध्यम से) से "नवीनतम स्नैपशॉट" की आवश्यकता है, तो मैं दृश्य इंटरफ़ेस में event LoadNodeDetailsEventHandler LoadNodeDetails
जैसे कुछ जोड़ूंगा, ताकि प्रस्तुतकर्ता इसे सब्सक्राइब कर सकता है, मॉडल से LoadNodeDetailsEventArgs.Node
(संभवतः किसी प्रकार की आईडी के माध्यम से) में नोड का ब्योरा प्राप्त करें, ताकि जब ईवेंट हैंडलर प्रतिनिधि रिटर्न देता है तो दृश्य इसके दिखाए गए नोड विवरण अपडेट कर सकता है। ध्यान दें कि यदि डेटा लाने से अच्छे उपयोगकर्ता अनुभव के लिए बहुत धीमा हो सकता है तो इसके एसिंक पैटर्न की आवश्यकता हो सकती है।
यह लिंक http://lostechies.com/derekgreer/2008/11/23/model-view-presenter-styles/ एमवीपी की कुछ शैलियों को बताता है। यह जोहान के उत्कृष्ट उत्तर के अलावा सहायक साबित हो सकता है। – ak3nat0n