ET.
ET.

Reputation: 1969

Simple DataBinding

I am trying to make a (very) simple Data Binding test, but it doesn't work as I expected... Say I have the following classes:

// 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";
        }
    }

I didn't add the designer code, but its there, and the form holds a TextBox object and a CheckBox object. As you can understand, I am trying to make the Textbox Text property change as the user checks \ unchecks the CheckBox. But this code doesn't update the TextBox Text property. Can someone please explain me what am I missing?

Upvotes: 6

Views: 727

Answers (2)

Jerod Houghtelling
Jerod Houghtelling

Reputation: 4867

You can use the INotifyPropertyChanged interface. I didn't run this through the IDE/compiler so there could be a syntax error.

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 ) );
        }
    }
} 

Upvotes: 4

Tim Robinson
Tim Robinson

Reputation: 54764

You need some way to notify WinForms when the value of the Data property changes. The most straightforward way is to either:

  • Add an event to DataSourceClass: public event EventHandler DataChanged;
  • Make DataSourceClass implement INotifyPropertyChanged. This gives you a PropertyChanged event.

Either way you'll have a new event that you need to raise. You'll need to convert your Data property from an auto property to one with a private field, a get method and a set method. Once you have an explicit getter and setter for the Data property, you'll be able to raise your event from inside the setter.

Upvotes: 7

Related Questions