encyklopedia.space

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, FrameworkElement oraz 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

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.