Proprietatile atasate sunt un caz aparte de DependencyProperties. Motivul principal pentru care exista este necesitatea de a corela elemente de layout intre ele. In articolul despre Dependency Properties, descriam cazul in care elemente de interfata sunt incuibate in controale container.
Sa luam in considerare cazul in care dorim sa setam pozitia unui buton intr-un Canvas. Codul va arata in felul urmator:
butonulMeu.SetValue(Canvas.TopProperty, 20);
butonulMeu.SetValue(Canvas.LeftProperty, 20);
Pentru a seta ZIndex-ul butonului, setam proprietatea Canvas.ZindexProperty
butonulMeu.SetValue(Canvas.ZIndexProperty, 3);
Modul de setare este compatibil cu XAML. Astfel acelasi cod pe care il scriem in code behind, poate fi scris astfel in XAML:
<Button x:Name="butonulMeu" Canvas.Left=”20” Canvas.Left=”20”
Canvas.ZIndex=”3”></Button>
Sa luam acum in considerare ca butonul nostru se afla intr-un grid, si vrem sa-I setam proprietatea intr-o celula. Atunci codul ar arata asa:
<Button x:Name="butonulMeu" Grid.Row="1" Grid.Column="2" ></Button>
Se vede foarte clar ca pentru contexte diferite, butonul are proprietati diferite. Practic nu ar avea sens sa definim toate proprietatile acestea in interiorul fiecarui clasei fiecarui control, pentru ca ar fi foarte multe si majoritatea nu ar avea sens decat intr-un anumit context. De aici solutia este ca ele sa fie implementate ca proprietati statice in cadrul claselor obiectelor respective (aici Grid si Canvas).
Un lucru care trebuie mentionat este ca proprietatile atasate nu sunt impachetate in proprietati normale .NET. De aici rezulta cateva dezavantaje. Pentru ca membrul pe care dorim sa-l modificam nu face parte din clasa noastra (Button aici), nu vom putea sa ne folosim de intelisense pentru a gasi proprietatea dorita. Un alt dezavantaj este ca toate proprietatile atasate sunt de tip Object, cea ce s-ar putea sa fie neintuitiv pentru ca nu stim exact ce valoarea asteapta proprietatea respectiva.
Ca sa ne fie mai usor, in general (insa nu intodeuna), obiectul container contine metode de tip SetProperty. De exemplu, Clasa grid contine metode statice de genul:
Grid.SetColumn(butonulMeu, 1);
Grid.SetColumnSpan(butonulMeu, 1);
Grid.SetRow(butonulMeu, 1);
Grid.SetRowSpan(butonulMeu, 1);
Un alt exemplu este clasa DockPanel:
DockPanel.SetDock(butonulMeu, Dock.Left);
in loc de:
butonulMeu.SetValue(DockPanel.DockProperty, Dock.Left);