Żródłem danych będzie obiekt klasy Pierwiastki. Jej zadaniem jest wyznaczenie pierwiastków równania kwadratowego Klasa jest zaprojektowana tak, aby jakakolwiek zmiana właściwości A, B, C wyzwalała przeliczenie wyniku poprzez wykonanie metody Oblicz(). W metodzie Oblicz() znajduje się także wywołanie metody WyznaczPrezentacjeWyniku(), która tworzy wygodną do wyświetlenia postać wyniku.
public class Pierwiastki : INotifyPropertyChanged
{
private double a;
public double A
{
get { return a; }
set { if (a != value) { a = value; Oblicz(); Powiadom("A"); } }
}
private double b;
public double B
{
get { return b; }
set { if (b != value) { b = value; Oblicz(); Powiadom("B"); } }
}
private double c;
public double C
{
get { return c; }
set { if (c != value) { c = value; Oblicz(); Powiadom("C"); } }
}
public double[] wynik { get; private set; }
private void Oblicz()
{
double delta = b * b - 4 * a * c;
if (delta < 0)
{
wynik = new double[0];
}
else if (delta == 0)
{
wynik = new double[1];
wynik[0] = -b / (2 * a);
}
else
{
wynik = new double[2];
wynik[0] = (-b - Math.Sqrt(delta)) / (2 * a);
wynik[1] = (-b + Math.Sqrt(delta)) / (2 * a);
}
WyznaczPrezentacjeWyniku();
}
private void WyznaczPrezentacjeWyniku()
{
if (wynik.Length == 0)
s = "Brak rozwiązań!";
else if (wynik.Length == 1)
s = string.Format("x0={0}", wynik[0]);
else
s = string.Format("x1={0}\r\nx2={1}", wynik[0], wynik[1]);
}
private string s;
public string S { get { return s; } }
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
void Powiadom(string NazwaWlasciwosci)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(NazwaWlasciwosci));
}
}
Implementacja interfejsu INotifyPropertyChanged nie jest konieczna o ile nie będzie zachodzić modyfikacja właściwości A, B, C w tle (tzn. bez pośrednictwa związych z właściwościami kontrolek).
W klasie formularza aplikacji zamieszczona jest deklaracja obiektu klasy Pierwiastki, który jest tworzony podczas działania konstruktora formularza. Również w konstruktorze formularza wykonywane jest samo wiązanie. Właściwości prw.A, prw.B, prw.C wiązane są z odpowiednimi kontrolkami klasy TextBox, zaś właściwość prw.S z kontrolką Label.
public partial class Form1 : Form
{
Pierwiastki prw;
public Form1()
{
InitializeComponent();
prw = new Pierwiastki();
Binding ba = new Binding("Text", prw, "A", false, DataSourceUpdateMode.OnPropertyChanged);
textBox1.DataBindings.Add(ba);
Binding bb = new Binding("Text", prw, "B", false, DataSourceUpdateMode.OnPropertyChanged);
textBox2.DataBindings.Add(bb);
Binding bc = new Binding("Text", prw, "C", false, DataSourceUpdateMode.OnPropertyChanged);
textBox3.DataBindings.Add(bc);
Binding bw = new Binding("Text", prw, "S", false, DataSourceUpdateMode.OnPropertyChanged);
label1.DataBindings.Add(bw);
}
private void button1_Click(object sender, EventArgs e)
{
prw.A = 123;
}
}
Metoda button1_Click() jest przykładem modyfikacji właściwości w tle i wizualizuje poprawną reakcję aplikacji dzięki implementacji interfejsu INotifyPropertyChanged.