C# DataBinding und INotifyPropertyChanged

Ich hätte es nie geschrieben, wenn mein Ex-Azubi Robert mich nicht heute danach gefragt hätte 😉
Also.. hier geht es darum Eigenschaften von einem Objekt an ein Steuerelement zu binden – und damit das Problem der Aktualisierung im Steuerelement wenn sich der Inhalt der Eigenschaft vom gebundenen Objekt ändert.


Ich Fange hier einfach mal mit einem ganz normalen Formular an.
Dieses hat ein Label und einen Knopf.
Das Label soll einen Wert aus einem Objekt anzeigen – und der Knopf soll diesen Ändern.
Der Code hierfür sieht so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
namespace Test
{
	public partial class Form2 : Form
	{
		DatenKlasse DatenObjekt;
 
		public Form2()
		{
			InitializeComponent();
			DatenObjekt = new DatenKlasse();
		}
 
		// Load der Form - Hinzufügen des DataBinding
		private void Form2_Load(object sender, EventArgs e)
		{
			label1.DataBindings.Add("Text",DatenObjekt,"DatenString");
		}
 
		// Click-Event des Button1 - Neusetzen der Eigenschaft im DatenObjekt
		private void button1_Click(object sender, EventArgs e)
		{
			DatenObjekt.DatenString = "Test2";
		}
	}
 
	// Die Test-Datenklasse
	public class DatenKlasse
	{
		public string DatenString { get; set; }
 
		public DatenKlasse()
		{
			DatenString = "Test";
		}
	}
}

Im Konstruktor der Form wird das DatenObjekt instanziiert.
Im Load der Form wird die Eigenschaft an das Label gebunden.
Und Im Click-Ebent sollte es geändert werden.

Letzteres passiert aber nicht – doof 🙁

Schuld ist, das hier das INotifyPropertyChanged für die Eigenschaft fehlt.
Ohne dieses Interface merkt keiner, dass die Eigenschaft geändert wurde und das Steuerelement aktualisiert werden soll.

Was müssen wir nun also tun, damit die aktualisierung des Labes funktioniert?
Genau – das INotifyPropertyChanged Interface in die DatenKlasse Implementieren.
Fertig sieht die DatenKlasse danach dann so aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Die Test-Datenklasse
public class DatenKlasse : INotifyPropertyChanged
{
	private string _DatenString;
	public string DatenString
	{
		get { return _DatenString; }
		set
		{
			_DatenString = value;
			NotifyPropertyChanged("DatenString");
		}
	}
 
	public DatenKlasse()
	{
		_DatenString = "Test";
	}
 
	#region ---- INotifyPropertyChanged Implementierung ----
	public event PropertyChangedEventHandler PropertyChanged;
	private void NotifyPropertyChanged(String info)
	{
		if (PropertyChanged != null)
		{
			PropertyChanged(this, new PropertyChangedEventArgs(info));
		}
	}
	#endregion
}

So… Nun ist das INotifyPropertyChanged Interface verbaut und mit einem Klick auf den Button1 wird auch das Label aktualisiert 🙂

Selbiges funktioniert natürlich auch mit einer Daten-gebundenen ComboBox.
Hierfür Brauchen wir als erstes eine Klasse aus dem wir Objekte für eine Liste erstellen können:

1
2
3
4
5
public class ListenElement
{
	public string ListenString1 { get; set; }
	public string ListenString2 { get; set; }
}

Diese Liste Bauen wir mit in die DatenKlasse ein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Die Test-Datenklasse
public class DatenKlasse : INotifyPropertyChanged
{
	private string _DatenString;
	public string DatenString
	{
		get { return _DatenString; }
		set
		{
			_DatenString = value;
			NotifyPropertyChanged("DatenString");
		}
	}
 
	// ----------------------------------------------
	// Liste für die Combo-Box
	private List<ListenElement> _DatenListe;
	public List<ListenElement> DatenListe
	{
		get { return _DatenListe; }
		set
		{
			_DatenListe = value;
			NotifyPropertyChanged("DatenListe");
		}
	}
	//-----------------------------------------------
 
	public DatenKlasse()
	{
		_DatenString = "Test";
		//------------------------------------------------------------------------------------------
		// Erzeugen der Liste mit ListenElementen für die Combo-Box
		_DatenListe = new List<ListenElement>();
		_DatenListe.Add(new ListenElement { ListenString1 = "string1", ListenString2 = "string2" });
		_DatenListe.Add(new ListenElement { ListenString1 = "string3", ListenString2 = "string4" });
		//------------------------------------------------------------------------------------------
	}
 
	#region ---- INotifyPropertyChanged Implementierung ----
	public event PropertyChangedEventHandler PropertyChanged;
	private void NotifyPropertyChanged(String info)
	{
		if (PropertyChanged != null)
		{
			PropertyChanged(this, new PropertyChangedEventArgs(info));
		}
	}
	#endregion
}

Und Unser Form bekommt eine Combobox, welche wir auch gleich an die Eigenschaft binden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public partial class Form2 : Form
{
	DatenKlasse DatenObjekt;
 
	public Form2()
	{
		InitializeComponent();
		DatenObjekt = new DatenKlasse();
	}
 
	// Load der Form - Hinzufügen des DataBinding
	private void Form2_Load(object sender, EventArgs e)
	{
		label1.DataBindings.Add("Text", DatenObjekt, "DatenString");
		//-----------------------------------------------------------------------------
		// Binden der ComboBox an die Liste des DatenObjektes
		comboBox1.DataBindings.Add("DataSource", DatenObjekt, "DatenListe");
		comboBox1.ValueMember = "ListenString1";
		comboBox1.DisplayMember = "ListenString2";
		//-----------------------------------------------------------------------------
	}
 
	// Click-Event des Button1 - Neusetzen der Eigenschaft im DatenObjekt
	private void button1_Click(object sender, EventArgs e)
	{
		DatenObjekt.DatenString = "Test2";
		//-----------------------------------------------------------------------------
		// Erstellen einer Neuen Liste für das DatenObjekt
		List<ListenElement> datenliste = new List<ListenElement>();
		datenliste.Add(new ListenElement { ListenString1 = "string11", ListenString2 = "string22" });
		datenliste.Add(new ListenElement { ListenString1 = "string33", ListenString2 = "string44" });
		DatenObjekt.DatenListe = datenliste;
		// JETZT ist die ComboBox mit Aktualisiert :-)
		//-----------------------------------------------------------------------------
	}
}

Ja…
Man Glaubt nicht, was man nun sieht – die ComboBox ist nun auch Gebunden und aktualisiert sich selbstständig mit dem ändern der Daten 🙂

Beispiel auf GoogleCode:
http://code.google.com/p/frickelblog/source/browse/#svn/trunk/samples/DataBinding_INotifyPropertyChanged
SVN-Checkout URL:
https://frickelblog.googlecode.com/svn/trunk/samples/DataBinding_INotifyPropertyChanged

leave your comment


*

Unterstütze den Frickelblog!