Za proces bindowania odpowiada klasa Binding. Posiada ona następujące właściwości:
- ElementName - nazwa element, który ma służyć jako źródło. Wykorzystujemy tę właściwość (zamiast Source) jeżeli bindujemy do elementu WPF (np. kontrolki)
- FallbackValue - wartość w przypadku gdy bindowanie zawiedzie
- Mode - kierunek przepływu danych
- NotifyOnSourceUpdated - jeżeli jest ustawiona ta flaga zostaje wywołane zdarzenie TargetUpdated podczas aktualizacji wartości z źródła do celu
- NotifyOnTargetUpdated - jeżeli jest ustawiona ta flaga zostaje wywołane zdarzenie TargetUpdated podczas aktualizacji wartości z celu do źródła
- Path - nazwa właściwości, która jest źródłem danych
- RelativeSource - bindowanie na podstawie położenia źródła w drzewie wizualnym
- Source - źródło w przypadku gdy nie bindujemy do elementu graficznego WPF
- TargetNullValue - wartość, gdy źródło jest niezainicjowane (null)
- XPath - zapytanie XPath w przypadku danych pobieranych z pliku XML
W przypadku najprostszej składni bindowania mamy do czynienia z połączeniem:
Bindowanie do elementu WPF
Najprostszy ze scenariuszów. Przykładowe bindowanie może wystąpić pomiędzy kontrolkami TextBlock i Slider: chcemy aby wartość ustawiona na suwaku została wyświetlona w kontrolce TextBlock. Realizacja tego zadania sprowadza się do:
Code:
To samo możemy osiągnąć w kodzie C# - np jeżeli potrzebujemy tworzyć bindowanie dynamiczne:
Code:
Usuwanie bindowania dynamiczne:
Code:
Bindowanie do obiektu
Jeżeli nie bindujemy do elementu WPF używamy właściwości Source.
Przykład:
Code:
Code:
DataContext
Żeby nie trzeba było za każdym razem ustawiać właściwości Source, można skorzystać z właściwości DataContext. Możemy ją ustawić zarówno dla pojedynczego elementu WPF, jak i całego kontenera. Najczęściej wykonuje się przypisanie w konstruktorze danego okna/kontrolki, a następnie binduje do poszczególnych elementów interfejsu użytkownika.
Code:
Code:
RelativeSource
Umożliwia bindowanie do elementu względem elementu docelowego. Typ bindowania jest uzależniony od właściwości Mode:
- FindAncestor - szuka elementu nadrzędnego; specyfikujemy AncestorType - typ elementu oraz AncestorLevel - ile poziomów do góry drzewa wizualnego ma zostać przeszukanych
- PreviousData - pozwala na bindowanie do poprzedniego elementu w przypadku list
- Self - binduje do samego siebie
- TemplatedParent - odnosi się do elementu, dla którego jest tworzony szablon kontrolki
Code:
Kierunek bindowania
Rysunek przedstawia możliwe kierunki bindowania danych:
- Default - domyślny tryb; w zależności od właściwości jest ustawione w jedną stronę lub obie
- OneTime - aktualizuje wartość jednokrotnie: albo podczas uruchomienia aplikacji lub po zmianie właściwości DataContext
- OneWay - pobiera aktualną wartość z źródła, ale w przypadku zmiany w elemencie docelowym nie zmienia źródła
- OneWayToSource - uaktualnia wartość źródła na podstawie wartości elementu docelowego; jeżeli wartość w źródle się zmieni nie będzie odzwierciedlona w elemencie docelowym
- TwoWay - zmiany są odwzorowywane w obu kierunkach
UpdateSourceTrigger
Właściwość ta determinuje jak często jest uaktualniane źródło zbindowane z danymi w trybie trybie TwoWay bądź OneWayToSource. Możliwe wartości tej właściwości to:
- Explicit - gdy zostanie wywołana metoda Binding.UpdateSource()
- LostFocus - gdy kontrolka zbindowana ze źródłem straci aktywność
- PropertyChanged - gdy właściwość elementu zmieni wartość
- Default - w zależności od ustawień standardowych (najczęściej tryb PropertyChanged)
"NotifyOnSourceUpdated - jeżeli jest ustawiona ta flaga zostaje wywołane zdarzenie TargetUpdated" - powinno być "SourceUpdated"
OdpowiedzUsuń