WPF – Dependency Property

MEGOSZTÁS

Ha tetszett a cikk, akkor nyugodtan oszd meg ismerőseiddel, valószínű ők is örülni fognak neki.

A Dependency Property-k a property-k egy egészen új implementációja. Mindenképp az alapvető WPF funkcionalitások közé kell sorolni, ugyanúgy, mint az animációt, adatkötést és a stílusokat. Nagy hasonlóságot mutatnak a normál WPF tulajdonságokhoz képest, de mégis különböznek tőlük. A Dependency Property-kre legegyszerűbben úgy gondolhatunk, mint normál tulajdonságokra sok hasznos hozzáadott funkcióval.

A Dependency Property létrehozása

A Dependency Property egy teljesen WPF specifikus eszköz. Létrehozásuk célja egyértelműen az automatikus változásértesítés támogatása, de ezen kívül számos más funkcionalitással rendelkeznek. A Dependency Property-k létrehozása egyáltalán nem okoz nagy nehézséget, de a szintaktikát egy kicsit szokni kell. Teljes mértékben eltérő a normál WPF property létrehozásához képest. Első lépés egy objektum létrehozása, ami a tulajdonságot reprezentálja. Ez egy leszármazottja, kell, hogy legyen a Dependency Property osztálynak. Elnevezési konvenció, hogy a Dependency Property-k neve mindig Propertyre végződnek. Így egyértelműen elkülöníthetők a normál tulajdonságoktól. Minden pillanatban elérhetőnek kell lenniük, ezért a Dependency Property objektumot statikus mezőként kell definiálni a kapcsolódó osztályban. Például a Framework Element osztály egy Margin tulajdonságot definiál, amit az összes elem megoszt. Nem meglepő, hogy a Margin tulajdonság egy Dependerncy Property. Ezek alapján a Framework Element osztályban a következőképp van definiálva:

public class FrameworkElement: UIElement, …
{
     public static readonly DependencyProperty MarginProperty;
     …
}

A WPF biztosítja, hogy a Dependency Object-eket nem lehet közvetlenül példányosítani, mert a Dependency Object osztály nem rendelkezik publikus konstruktorral. Ehelyett a a példányait a DependencyProperty.Register() metódusával lehetséges létrehozni. A WPF azt is megszabja, hogy a Dependency Object-eket a létrehozás után ne lehessen módosítani, mert a DependencyProperty tagok csak olvashatók. Az értékeit a DependencyProperty.Register() metódus argumentumaiként kell megadni. A következő kódrészlet megadja, hogy miképp kell létrehozni egy Dependency Property-t:

 

static FrameworkElement()
{
     FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(
     new Thickness(), FrameworkPropertyMetadataOptions.AffectsMeasure);
     MarginProperty = DependencyProperty.Register(“Margin”,
     typeof(Thickness), typeof(FrameworkElement), metadata,
     new ValidateValueCallback(FrameworkElement.IsMarginValid));
     …
}

Két lépésből áll egy Dependency Property létrehozása. Először létre kell hozni egy FrameworkPropertyMetadata objektumot, ami jelzi, hogy milyen szolgáltatásokat szeretnénk használni a Dependency Property-vel. Következő lépés a DependencyProperty.Register() metódus meghívása a megfelelő argumentummal:

– A Property neve
– A Property által használt adattípus (jelen esetben Thickness)
– A Property, ami birtokolja ezt a tulajdonságot (jelen esetben a FrameworkElement osztály)
– Opcionálisan a FrameworkPropertyMetaData objektum
– Opcionálisan egy callback, ami a property validációját végzi

Property validáció

A validation callback lehetővé teszi a property validációját. A megadott callback egy metódusra kell, hogy mutasson, ami az objektum egy példányát várja paraméterül, és egy logikai értékkel tér vissza. Igaz értékkel való visszatérés esetén az objektum el lett fogadva, hamis esetén visszautasítva.

public Thickness Margin
{
     set { SetValue(MarginProperty, value); }
     get { return (Thickness)GetValue(MarginProperty); }
}

 

Property wrapper

Az utolsó lépés a property csomagolójának létrehozása. Ha a Dependency Property-t futási időben a XAML kódból szeretnénk használni, akkor szükséges a property wrapper létezése. Lényeges, hogy a property wrapperbe ne helyezzünk a  GetValue() és SetValue() hívásokon kívül más kódot. Az előző példához tartozó property csomagolója:

 

public Thickness Margin
{
     set { SetValue(MarginProperty, value); }
     get { return (Thickness)GetValue(MarginProperty); }
}

Most már egy teljesen működőképes Dependency Property áll rendelkezésünkre, aminek értékét bármely más .NET property-hez hasonlóan beállíthatjuk:

myElement.Margin = new Thickness(5);

 

 

Forrás: Pro WPF in C# 2008

Írta: Sallai Máté

 

 

 

 

MEGOSZTÁS

Ha tetszett a cikk, akkor nyugodtan oszd meg ismerőseiddel, valószínű ők is örülni fognak neki.

HOZZÁSZÓLÁS

Ha nem hagy nyugodni az, amit a cikkben olvastál, akkor nyugodtan írd meg kérdésed vagy észrevételed kommentbe. Így szerzőnk könnyen tud neked válaszolni.

Vélemény, hozzászólás?


Warning: Unknown: write failed: No space left on device (28) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/www/clients/client0/web5/tmp) in Unknown on line 0