2012-02-15 8 views
7

मैं मुख्य रूप से कुछ एमवीसी के साथ एएसपी.Net पृष्ठभूमि से हूं। मैंने थोड़ा सिल्वरलाइट और एमवीवीएम भी किया है, हालांकि अब मैं विनफॉर्म में जाने के बारे में हूं, जिसके बारे में मुझे बहुत कम अनुभव है, इसलिए मैं सोच रहा हूं कि एमवीपी से कैसे निपटें।Winforms में एमवीपी

विशिष्ट एमवीपी नमूने प्रस्तुतकर्ता को एक दृश्य संपत्ति (किसी प्रकार के आईवी व्यू इंटरफ़ेस के माध्यम से) दिखाते हैं, जिसमें ठोस दृश्य उदाहरण के लिए उस टेक्स्ट मान को टेक्स्टबॉक्स में डालता है। इस पुरातन दृष्टिकोण के बजाय, क्या कोई व्यक्ति एमवीपी में बदलकर INotifyProperty का उपयोग कर सकता है, और यदि ऐसा है तो कैसे? एक बहुत तेज़ उदाहरण वास्तव में उपयोगी होगा!

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

अग्रिम धन्यवाद एंडी।

उत्तर

8

मैंने अभी जांच की है कि WinForms में डेटा बाइंडिंग INotifyProperty का उपयोग करता है। डेटा BindingSource वास्तव में का समर्थन करता है के माध्यम से बाध्यकारी INotifyPropertyChanged अगर BindingSource या मॉडल संपत्ति के डेटास्रोत वस्तु इसी DataMemberको यह लागू करता है। आप प्रस्तुतकर्ता/नियंत्रक की पूर्ण सीमा तक एम। फाउलर का उपयोग कर सकते हैं: आपको हाथ से लिखित कोड की भी आवश्यकता नहीं है, बाइंडिंग स्रोत दोनों दिशाओं में मॉडल गुणों के साथ दृश्य को सिंक्रनाइज़ करता है (मॉडल -> देखें और देखें - > मॉडल), और यदि मॉडल INotifyProperty का समर्थन करता है तो दृश्य स्वचालित रूप से अपडेट हो जाएगा। कोड निर्माणों मैं अब तक का इस्तेमाल किया है:

  1. दृश्य प्रारंभ के दौरान:

    this.bindingSource.DataSource = this.presenter;

  2. डिजाइनर द्वारा उत्पन्न कोड:

    this.textBoxPhone.DataBindings.Add (नई System.Windows.Forms.Binding ("पाठ", this.bindingSource, "Model.Phone", सच, System.Windows .Forms.DataSourceUpdateMode।OnPropertyChanged));

मॉडल वर्ग:

public class Customer : INotifyPropertyChanged 
{ 
    private string _firstName; 
    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      if (_firstName == value) 
       return; 
      _firstName = value; 
      NotifyPropertyChanged("FirstName"); 
     } 
    } 

    private string _lastName; 
    public string LastName 
    { 
     get { return _lastName; } 
     set 
     { 
      if (_lastName == value) 
       return; 
      _lastName = value; 
      NotifyPropertyChanged("LastName"); 
     } 
    } 

    private string _company; 
    public string Company 
    { 
     get { return _company; } 
     set 
     { 
      if (_company == value) 
       return; 
      _company = value; 
      NotifyPropertyChanged("Company"); 
     } 
    } 

    private string _phone; 
    public string Phone 
    { 
     get { return _phone; } 
     set 
     { 
      if (_phone == value) 
       return; 
      _phone = value; 
      NotifyPropertyChanged("Phone"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

प्रस्तोता वर्ग:

public class CustomerPresenter 
{ 
    public CustomerPresenter(Customer model) 
    { 
     if (model == null) 
      throw new ArgumentNullException("model"); 

     this.Model = model; 
    } 

    public Customer Model { get; set; } 

    public ICustomerView View { private get; set; } 
} 
+0

यह जानना वाकई उपयोगी है। प्रतिक्रिया पोस्ट करने के लिए धन्यवाद। –

+0

वास्तव में एक उपयोगी उदाहरण है। हालांकि, क्या मॉडल को सीधे दृश्य में उजागर करने में कोई समस्या नहीं है? शायद एक ViewModel का उपयोग करना बेहतर होगा। – kasperhj

0

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

0

आप कुछ छूट न जाए। एमवीवीएम WinForms के साथ बहुत उपयुक्त है। माइक्रोसॉफ्ट केवल इसके साथ डब्ल्यूपीएफ और एमवीवीएम पैटर्न के उपयोग को encoureges।