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
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.
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl