Data Binding jest często stosowany w aplikacjach zintegrowanych z bazą danych. Taki mechanizm daje możliwość przeglądania zawartości bazy danych. Zmiana danych w jednej kontrolce (np. listbox) powoduje automatyczną zmianę w pozostałych z nią powiązanych.
Przedstawione przeze mnie bindowanie nie będzie wiązaniem danych pobieranych z bazą danych, lecz wiązaniem stworzonej przez siebie listy wymyślnej klasy – z różnymi kontrolkami.
Na początku utworzę klasę Person
class Person { public Person(string name, string surname, int age, string job, Color color, Font font) { Name = name; Surname = surname; Age = age; Job = job; Color = color; Font = font; } private string _name; private string _surname; private int _age; private string _job; private Color _color; private Font _font; public Font Font { get { return _font; } set { _font = value; } } public Color Color { get { return _color; } set { _color = value; } } public string Name { get { return _name; } set { _name = value; } } public string Surname { get { return _surname; } set { _surname = value; } } public int Age { get { return _age; } set { _age = value; } } public string Job { get { return _job; } set { _job = value; } } public string NameSurname { get { return _name + " " + _surname; } } }
Klasa Person definiuje 6 pól, które opisuje _name, _surname, _age, _job, _color, oraz _font.
Nie będziemy się tutaj skupiać na tym, co przechowują same pola i jakiego są typu. Uwagę skoncentrujemy na samym mechanizmie data bindingu.
W data bindingu warunkiem koniecznym dla prawidłowego działania jest operowanie na właściwościach. Bez nich program nie będzie działał prawidłowo.
Teraz pozwolę sobie utworzyć listę klas oraz wypełnię ją kilkoma instancjami.
List person = new List() { new Person("John", "Nowak", 30, "accountant", Color.Red, new Font("Meiryo UI", 7.6f)), new Person("Jeremy", "Kowalski", 20, "policeman", Color.Beige, new Font("Magneto", 8)), new Person("Clara", "Wiśniewska", 40, "programmer", Color.Blue, new Font("Mistral", 9)), new Person("Mey", "Kwiatkowska", 50, "unemployed", Color.DarkGray, new Font("Monotype Corsiva", 10.5f)) };
Nim przejdę do samego bindowania, utworzę formę, gdzie mógłbym wyświetlać swoją listę oraz po wybraniu pozycji z listboxa wyświetlą mi się szczegółowe dane wybranej pozycji.
Przyznam, że Data Binding jest bardzo przyjemny i uwielbiam z niego korzystać. Ponadto oferuje olbrzymie możliwości – nie tylko wprowadzania wartości tekstowych, ale także bindowania tekstu z obrazkami itp.
Rozpoczynamy właściwe bindowanie
1. Metodą DataSource wstawiam swoją listę person do listboxa. Jako sposób wyświetlania wybieram „NameSurname” – jest to właściwość zaprogramowana w taki sposób, aby zwracała imię i nazwisko.
listBoxPerson.DataSource = person; listBoxPerson.DisplayMember = "NameSurname";
2. Binduje wszystkie kontrolki z listą person
textBoxName.DataBindings.Add(new Binding("Text", person, "Name")); textBoxName.DataBindings.Add(new Binding("Font", person, "Font")); textBoxSurname.DataBindings.Add(new Binding("Text", person, "Surname")); textBoxSurname.DataBindings.Add(new Binding("Font", person, "Font")); textBoxAge.DataBindings.Add(new Binding("Text", person, "Age")); textBoxAge.DataBindings.Add(new Binding("Font", person, "Font")); textBoxJob.DataBindings.Add(new Binding("Text", person, "Job")); textBoxJob.DataBindings.Add(new Binding("Font", person, "Font")); textBoxColor.DataBindings.Add(new Binding("BackColor", person, "Color")); textBoxColor.DataBindings.Add(new Binding("Font", person, "Font"));
Sama implementacja jest prosta. W pierwszej kolejności wpisuję nazwę kontrolki, do której się odwołuje. Jako przykład rozpatruję pierwszą kontrolkę:
textBoxName
Następnie korzystam z klasy DataBindings i wybieram funkcję Add. Funkcja add posiada 6 przeciążeń. Standardowa funkcja przyjmuje 3 parametry gdzie
pierwszym parametrem jest Nazwa właściwości
new Binding("Text", person, "Name")
wpisuje “Text”, ponieważ chcę zmienić tekst w kontrolce
drugim parametrem jest źródło danych
new Binding("Text", person, "Name")
wpisuję person, ponieważ odwołuję się do utworzonej przez siebie listy o nazwie person
trzecim parametrem jest właściwość przechowująca dane
new Binding("Text", person, "Name")
wpisuję “Name”, ponieważ chcę pobrać z klasy Person wartość o właśnie tej nazwie.
W tych prostych korkach wykonaliśmy bindowanie pierwszej kontrolki. Jeżeli chcemy, dodać kolejne bindowanie do tej samej kontrolki posługujemy się metodą Add.
Każda z instancji klas Person posiada swoją indywidualną czcionkę. Wykorzystam to, aby odpowiednio sformatować tekst wg. podanej czcionki.
Zasada tworzenia jest taka sama. Moim propery name jest tym razem Font. Kolejnie podaję źródło i właściwość, z jakiej czerpię dane. Tak się złożyło, że moja właściwość oraz property name są takie same, ale należy pamiętać, że nazwę właściwości ustala programista i może wpisać sobie tutaj, co mu się podoba.
textBoxName.DataBindings.Add(new Binding("Font", person, "Font"));
W jednym z bindowań koloruję kontrolkę. Robię to za pomocą poniższego bindowania:
textBoxColor.DataBindings.Add(new Binding("BackColor", person, "Color"));
Moim property name jest BackColor a właściwością Color. Po takim zabiegu kontrolka wypełni mi się kolorem zgodnym z polem instancji.
Poniżej kilka Screenów z działania programiku:
Osobiście przyznam, że jest to dość uporczywy sposób. Na szczęście programistów wykorzystujących we własnych aplikacjach XAML ten problem nie dotyczy.