DependencyProperty
DependencyProperty (pol. właściwość zależna) jest kluczowym elementem Windows Presentation Foundation (WPF) oraz innych technologii XAML-opartych, które korzystają z systemu właściwości zależnych. Wprowadza on mechanizm umożliwiający rozbudowane funkcje takie jak wiązanie danych, animacja, stylowanie oraz dziedziczenie wartości właściwości w kontrolkach i elementach interfejsu użytkownika.
Historia
System właściwości zależnych został po raz pierwszy zaprojektowany w ramach Microsoft jako część platformy .NET w wersji 2006, a jego implementacja pojawiła się w WPF w 2006 roku wraz z wydaniem .NET Framework 3.0.
Podstawowe pojęcia
- Właściwość zależna (DependencyProperty) – specjalny obiekt opisujący metadane właściwości, taki jak jej typ, domyślna wartość oraz flagi zachowań.
- Wartość zależna (DependencyObject) – klasa bazowa, z której wywodzą się wszystkie obiekty obsługujące DependencyProperty. Przykłady to
UIElement,FrameworkElementoraz kontrolki. - Metadane właściwości (PropertyMetadata) – struktura określająca domyślną wartość, callbacki przy zmianie wartości oraz opcje wpływające na optymalizację pamięci.
Rejestracja właściwości zależnej
Rejestracja odbywa się statycznie przy pomocy metody DependencyProperty.Register. Przykładowa deklaracja w języku C#:
public static readonly DependencyProperty IsHighlightedProperty =
DependencyProperty.Register(
"IsHighlighted", // nazwa właściwości
typeof(bool), // typ właściwości
typeof(MyControl), // typ właściciela
new PropertyMetadata(false) // metadane (wartość domyślna)
);
Po rejestracji właściwość jest dostępna poprzez klasyczne gettery i settery lub metodę GetValue/SetValue dziedziczoną po DependencyObject.
Mechanizmy wspierane przez DependencyProperty
Wiązanie danych (Data Binding)
Właściwości zależne są naturalnym miejscem do podłączania bindingu. Dzięki temu zmiana wartości w modelu danych automatycznie odświeża interfejs.
Animacja
System animacji WPF operuje bezpośrednio na DependencyProperty, co pozwala animować praktycznie każdą właściwość liczbową, np. Width, Opacity czy RenderTransform.
Stylowanie i szablony
Właściwości zależne mogą być ustawiane w stylach i szablonach kontrolek. Pozwala to na definiowanie wyglądu i zachowania elementów w jednym miejscu.
Dziedziczenie wartości
Niektóre właściwości (np. DataContext) są oznaczone jako dziedziczące, co oznacza, że ich wartość przekazywana jest automatycznie do wszystkich podrzędnych obiektów w drzewie wizualnym.
Porównanie z tradycyjnymi właściwościami CLR
| Cecha | Właściwość CLR | DependencyProperty |
|---|---|---|
| Przechowywanie wartości | pole w obiekcie | centralny słownik w DependencyObject |
| Wsparcie dla data binding | ograniczone | pełne (automatyczna aktualizacja) |
| Możliwość animacji | brak | tak |
| Dziedziczenie wartości | nie | tak (przy odpowiedniej konfiguracji) |
Zastosowania praktyczne
Przykładowe scenariusze, w których używa się DependencyProperty:
- Tworzenie własnych kontrolek UI z własnymi właściwościami, które mogą być wiązane w XAML.
- Implementacja dynamicznych interfejsów, które reagują na zmiany danych w czasie rzeczywistym.
- Budowanie szablonów, które umożliwiają modyfikację wyglądu aplikacji bez ingerencji w kod.
- Wykorzystanie systemu animacji do płynnych przejść i efektów wizualnych.
Przykład użycia w XAML
<Window x:Class="Demo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Demo">
<Grid>
<Button Content="Kliknij mnie"
local:MyControl.IsHighlighted="{Binding IsSelected}"
Width="150" Height="40"/>
</Grid>
</Window>
W powyższym fragmencie IsHighlighted jest własnością zależną zdefiniowaną w MyControl, a jej wartość jest powiązana z właściwością IsSelected w modelu widoku.
Powiązane pojęcia
- Windows Presentation Foundation
- XAML
- DependencyObject
- PropertyMetadata
- Data Binding
- Control Template
- SignalR (przykład integracji z aplikacjami sieciowymi)
Bibliografia i dodatkowe materiały
Wewnętrzna dokumentacja platformy .NET opisuje szczegółowo strukturę DependencyProperty oraz najlepsze praktyki jej użycia. Dostępne są także liczne artykuły w sekcjach programowanie obiektowe i platforma .NET.