Reputation: 1969
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
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
Reputation: 54764
You need some way to notify WinForms when the value of the Data
property changes. The most straightforward way is to either:
DataSourceClass
: public event EventHandler DataChanged;
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