Dzisiejszy odcinek poświęcony będzie zagadnieniu DataBindning. Zagadnienie to nie jest nowe – mamy je także w Win i WebForms, jednak w przypadku technologii WPF nabiera ono zupełnie nowego wymiaru.

Binding w kodzie

Możemy to zrobić w prosty sposób za pomocą elementy Binding

Binding binding = new Binding();

binding.Source = tekst;

binding.Path = new PropertyPath(“Text”);

label.SetBinding(TextBlock.TextProperty, binding);

Dzięki takiemu zabiegowi tekst, tekst który wprowadzimy pojawi się także w polu label. Binding taki będzie aktywny, aż do czasu, aż go nie wyczyścimy:

BindingOperations.ClearBinding(label, TextBlock.TextProperty);

To samo można osiągnąć, poprzez jawne podstawienia wartości pod docelową właściwość (w tym przypadku Text.

XAML

Podobny zabieg bindowania możemy oczywiście zdefiniować w języku XAML.

<TextBox x:Name=”tekst” />

<TextBlock x:Name=”label” Text=”{Binding ElementName=tekst, Path=Text}” />

Warto zauważyć, iż posługujemy się właściwością ElementName. Możemy oczywiście użyć Source, ale wtedy nasz element musielibyśmy zdefiniować w słowniku ResourceDictionary i odwoływać się do niego za pomocą StaticResource.

Bindowanie do prostych właściwości w .NET

Jeśli chcemy umożliwić binding w naszych klasach musimy odpowiednio je przygotować. Mamy do wyboru dwa podejścia (preferowane pierwsze):

  • implementujemy w naszej klasie interface INotifyPropertyChanged, który zawiera jeden wspólny event PropertyChanged

  • implementujemy eventy XXXChanged dla każdej z właściwości, którą chcemy móc bindować

Dodatkowo jeśli nasza klasa jest kolekcją i chcemy do niej bindować warto skorzystać z klasy ObservableCollection, która już ma zaimplementowane notyfikacje dla operacji na niej (Add, Remove, Clear). Bindowanie to obiektów, które nie dziedziczą po klasie UIElement spowoduje, że w wyniku dostaniemy zwrócony tekst z wykonania metody ToString().

Bindowanie kolekcji

Bindując kolekcję zapewne posłużymy się, jedną z kontrolek umożliwiająca wyświetlenie kolekcji elementów – np. ListBox. W przypadku tej kontrolki element źródłowy podpinamy do właściwości ItemsSource. Jeśli chcemy wyświetlać element inny niż wynik wykonania metody ToString powinniśmy ustawić właściwość DisplayMemberPath. Jeśli chcemy współdzielić dany obiekt źródłowy bindowania przez wiele kontrolek powinniśmy ustawić go jako wartość właściwości DataContext a na poszczególnych kontrolkach bindować do poszczególnych właściwości.

Następnym razem będzie trochę o kontrolowaniu tego jak wyglądają nasze zbindowane elementy – ValueConverter, DataTemplate.