2010-08-11 13 views
6

मैं एक (बहुत) सरल डेटा बाइंडिंग परीक्षण बनाने के लिए कोशिश कर रहा हूँ, लेकिन यह के रूप में मैं उम्मीद काम नहीं करता है ... कहते हैं कि मैं निम्नलिखित श्रेणियां होती हैं:सरल DataBinding

// this class represents some kind of data producer 
public class DataSourceClass 
    { 
     public string Data { get; set; } 

     public DataSourceClass() 
     { } 
    } 


//this form holds the TextBox control as the Data consumer 
public partial class DatabindingTestForm : Form 
    { 
     public DataSourceClass ds { get; set; } 
     public DatabindingTestForm() 
     { 
      InitializeComponent(); 
      ds = new DataSourceClass(); 
      textBox.DataBindings.Add("Text", ds, "Data"); 
     } 

     private void checkBox_CheckedChanged(object sender, EventArgs e) 
     { 
      if (checkBox.Checked) 
       ds.Data = "CHECKED"; 
      else 
       ds.Data = "NOT CHECKED"; 
     } 
    } 

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

उत्तर

7

आप WinForms सूचित करने के लिए किसी तरह की जरूरत है जब Data गुण परिवर्तन का मूल्य।

  • DataSourceClass में एक ईवेंट जोड़ें: सबसे सरल तरीका है या तो है public event EventHandler DataChanged;
  • DataSourceClass बनाओ INotifyPropertyChanged लागू। यह आपको PropertyChanged ईवेंट देता है।

किसी भी तरह से आपके पास एक नई घटना होगी जिसे आपको उठाने की आवश्यकता है। आपको अपनी Data संपत्ति को एक ऑटो प्रॉपर्टी से एक निजी क्षेत्र, get विधि और set विधि में परिवर्तित करने की आवश्यकता होगी। एक बार जब आपके पास Data संपत्ति के लिए एक स्पष्ट गेटर और सेटटर हो, तो आप अपना ईवेंट सेटटर के अंदर से बढ़ा सकेंगे।

+0

मुझे यह भरने में मिला कि मुझे मुख्य विचार याद आ रहा है ... अगर मुझे किसी ईवेंट को जोड़ने की ज़रूरत है तो मुझे डेटा बाइंडिंग का उपयोग करने की आवश्यकता क्यों है? मैं सिर्फ घटना का उपयोग कर सकता था (कोई नियंत्रण बाइंडिंग चयन आवश्यक ...) –

+0

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

4

आप INotifyPropertyChanged इंटरफ़ेस का उपयोग कर सकते हैं। मैंने आईडीई/कंपाइलर के माध्यम से इसे नहीं चलाया, इसलिए एक वाक्यविन्यास त्रुटि हो सकती है।

public class DataSourceClass : INotifyPropertyChanged 
{ 
    private string _data; 

    public string Data 
    { 
     get 
     { 
      return _data; 
     } 
     set 
     { 
      if(_data != value) 
      { 
       _data = value; 
       OnPropertyChanged("data"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if(handler != null) 
     { 
      handler(new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
}