Proprietăți Dependență - este un tip de proprietate care se extinde proprietatea CLR. In timp ce CRJ proprietate este citit direct de membrul al clasei, Dependență de proprietate vor fi rezolvate în mod dinamic atunci când apelați GetValue (), care devine obiectul dvs. prin moștenire de la o clasă de bază DependencyObject. Această secțiune va distruge proprietățile de dependență și explică utilizarea lor este atât conceptual și cu ajutorul unor exemple de cod.
Proprietăți de dependență standard
Practic, toate controalele WPF utilizează proprietăți puternice de dependență. Proprietatea de dependență vă permite să utilizați mai multe funcții WPF care nu sunt posibile cu proprietățile CLR standard, inclusiv, dar fără a se limita la, suport pentru stiluri, animații, legare de date, moștenire valori și notificări de modificare.
Proprietatea TextBox.Text este un exemplu simplu în care este necesară o proprietate de dependență standard. Aici, legarea datelor nu este posibilă dacă Text este proprietatea CLR standard.
Proprietățile de dependență pot fi definite numai în clasele derivate din DependencyObject. cum ar fi FrameworkElement. Control și așa mai departe.
Una dintre cele mai rapide căi de a crea o proprietate de dependență standard fără a fi nevoie să vă amintiți de sintaxă este să utilizați fragmentul "propdp" introducând propdp și apoi apăsând Tab. Va fi adăugat un fragment de cod, care poate fi apoi modificat în funcție de nevoile dvs.:
Pentru a efectua modificările necesare, trebuie să faceți o filă în diferite părți ale fragmentului de cod, inclusiv actualizarea numelui proprietății, a tipului de proprietate care conține tipul de clasă și valorile implicite.
Există câteva convenții / reguli importante:
Creați o proprietate CLR pentru proprietatea de dependență. Această proprietate este utilizată în codul pentru obiect sau pentru alți utilizatori. Ar trebui să numească GetValue și SetValue, astfel încât consumatorii să nu aibă nevoie de ea.
Denumiți proprietatea de dependență corect. Câmpul DependențăProprietate trebuie să fie public static readonly. Trebuie să aibă un nume care să corespundă cu numele proprietății CLR și să se încheie cu o proprietate, cum ar fi Text și TextProperty.
Nu adăugați o logică suplimentară la instrumentul de setare a proprietății CLR. Sistemul proprietății de dependență (și în mod specific XAML) nu utilizează proprietatea CLR. Dacă doriți să efectuați o acțiune atunci când modificați o valoare de proprietate, trebuie să furnizați un apel invers prin intermediul PropertyMetadata.
Pentru a elimina necesitatea de a specifica modul = twoWay pe opțiunea în legături (comportament TextBox.Text similare), actualizați codul pentru a utiliza în schimb FrameworkPropertyMetadata PropertyMetadata și specificați steagul corespunzător:
Proprietăți legate de dependență
O proprietate imbricată este o proprietate de dependență care poate fi aplicată oricărui DependencyObject pentru a îmbunătăți comportamentul diferitelor controale sau servicii care știu despre existența unei proprietăți.
Câteva exemple de utilizare a proprietăților atașate includ:
- Prezența elementului părinte al iterației prin copii și un anumit efect asupra copiilor. De exemplu, controlul Grid utilizează proprietățile conexe Grid.Row. Grid.Column. Grid.RowSpan și Grid.ColumnSpan pentru a plasa elementele în rânduri și coloane.
- Adăugarea de efecte vizuale la comenzile existente folosind șabloane personalizate, de exemplu adăugarea de filigrane pentru câmpurile de text goale din aplicație, fără subclasa TextBox.
- Furnizați un serviciu sau o funcție comună pentru unele sau toate comenzile existente, de exemplu ToolTipService sau FocusManager. Ele sunt denumite de obicei comportament atașat.
- Când doriți să moșteniți arborele vizual, de exemplu, similar cu comportamentul DataContext.
Acest lucru arată din nou ce se întâmplă când se utilizează o rețea.
Grid.Column nu este o proprietate care există în Label sau TextBox. Mai degrabă, controlul rețelei privește elementele copilului și le aranjează în funcție de valorile proprietăților atașate.
Vom continua să folosim grila pentru acest exemplu. Definiția Grid.Column este prezentată mai jos, dar DependencyPropertyChangedEventHandler este exclusă pentru scurtă durată.
Deoarece proprietățile atașate pot fi atașate la o gamă largă de elemente, ele nu pot fi implementate ca proprietăți CLR. În schimb, sunt introduse câteva metode statice.
Prin urmare, spre deosebire de proprietățile de dependență standard, proprietățile atașate pot fi, de asemenea, definite în clase care nu sunt derivate din DependencyObject.
De asemenea, se aplică aceleași convenții de numire care se aplică proprietăților de dependență normale: proprietatea de dependență RowProperty are metodele corespunzătoare GetRow și SetRow.
Deși moștenirea proprietății pare să funcționeze pentru proprietăți de dependență nelegate, comportamentul de mostenire pentru o proprietate neasociată peste limitele definite ale elementelor din arborele Runtime este nedefinit. Utilizați întotdeauna RegisterAttached pentru a înregistra proprietățile în care specificați Moștenirea în metadate.
Proprietăți de dependență numai pentru citire
Proprietatea read-only este similară cu proprietatea de dependență normală, dar este structurată astfel încât să nu aibă valori stabilite din afara controlului. Acest lucru funcționează bine dacă aveți o proprietate care este pur informativă pentru consumatori, cum ar fi IsMouseOver sau IsKeyboardFocusWithin.
Ca proprietățile de dependență standard, proprietatea dependenței numai pentru citire trebuie definită în clasa care derivă din DependencyObject.
Aici se aplică aceleași convenții care se aplică proprietăților obișnuite de dependență, dar cu două diferențe esențiale:
- DependencyProperty vine de la DependencyPropertyKey privat.
- Proprietatea proprietate protejată sau privată a CLR nu este publică.
Rețineți că setatorul trece MyPropertyPropertyKey și nu MyPropertyProperty la metoda SetValue. Deoarece proprietatea a fost citită numai, orice încercare de a utiliza SetValue în proprietate ar trebui să fie utilizată cu o suprasarcină care devine DependencyPropertyKey; În caz contrar, va exista o InvalidOperationException.