Wpf, faceți clic pe obiecte

Atunci când se leagă la un obiect care nu este un element, trebuie să abandonați proprietatea Binding.ElementName și să folosiți una dintre următoarele proprietăți:







Indică obiectul sursă care utilizează obiectul RelativeSource, care vă permite să bazăți o referință la elementul curent. Acesta este un instrument specializat, care este convenabil atunci când se scriu șabloane de control și șabloane de date.

Dacă sursa nu a fost specificată utilizând proprietatea Source sau proprietatea RelativeSource, mediul WPF caută arborele elementului pornind de la elementul curent. Controlează proprietatea DataContext a fiecărui element și utilizează primul element, care nu este nul. Proprietatea DataContext este extrem de utilă atunci când trebuie să legați mai multe proprietăți ale unui obiect de elemente diferite, deoarece puteți seta proprietatea DataContext a unui obiect de container la nivel înalt, în loc să îl setați direct la elementul țintă.

Mai jos, aceste opțiuni sunt descrise mai detaliat.

Proprietatea sursă

Proprietatea Source este simplă. Singurul punct care trebuie luat în considerare este faptul că obiectul de date ar trebui să fie convenabil pentru legare. După cum se va arăta, există câteva abordări pentru obținerea unui obiect de date: extrageți-l dintr-o resursă, generați-l programabil sau extrageți-l de la un furnizor de date.

Cea mai simplă opțiune este instalarea sursei în obiect static, disponibil și disponibil. De exemplu, puteți crea un obiect static în cod și îl puteți folosi. Alternativ, puteți aplica ingredientul din biblioteca de clasă .NET, după cum se arată mai jos:

Această expresie obligatorie primește un obiect FontFamily, care este furnizat de proprietatea SystemFonts.IconFontFamily. (Rețineți că instalarea proprietății Binding.Source necesită ajutorul Static Markup Extension.) Apoi, proprietatea Binding.Path este setată la proprietatea FontFamily.Source, care dă numele familiei de fonturi. Rezultatul este o singură linie de text. În Windows Vista sau Windows 7, numele fontului arată ca UI Segoe.

O altă opțiune este legarea la un obiect care a fost creat anterior ca resursă. De exemplu, următorul marcaj creează un obiect FontFamily care indică fontul Calibri:

Proprietatea RelativeSource

Proprietatea RelativeSource vă permite să o setați la obiectul sursă pe baza relației sale cu obiectul țintă. De exemplu, puteți utiliza proprietatea RelativeSource pentru a lega un element în sine sau pentru a se lega de un element parent care se află într-un număr necunoscut de niveluri mai înalte în arborele elementului.

Pentru a seta proprietatea Binding.RelativeSource, utilizați obiectul RelativeSource. Aceasta complică oarecum sintaxa, deoarece trebuie să creați un obiect Binding și în interiorul acestuia un obiect imbricat RelativeSource. O singură opțiune este să utilizați sintaxa de setare a proprietății în locul extensiei marcajului de legare.







De exemplu, următorul cod creează un obiect Binding pentru proprietatea TextBlock.Text. Obiectul Obligatoriu utilizează RelativeSource, care caută fereastra părinte și afișează titlul ferestrei:

Pentru obiectul RelativeSource, este selectat modul FindAncestor, care îl obligă să caute arborele de elemente până când se găsește un tip de element definit de proprietatea AncestorType.

Cea mai obișnuită metodă de a scrie această obligație este să o combinați într-o singură linie, utilizând extensiile de marcare Binding și RelativeSource, după cum se arată mai jos:

Modul FindAncestor este una dintre cele patru opțiuni posibile atunci când creați un obiect RelativeSource. Toate opțiunile sunt descrise în cele ce urmează:

O expresie este legată de o altă proprietate a aceluiași element

Expresia este legată de elementul părinte. WPF va căuta arborele elementului până când va găsi elementul părinte dorit. Pentru a specifica un părinte, trebuie de asemenea să setați proprietatea AncestorType pentru a indica tipul elementului părinte care ar trebui găsit. În plus, utilizând proprietatea AncestorLevel, puteți sări peste un anumit număr de potriviri pentru elementul specificat. De exemplu, pentru a se lega la al treilea element de tip ListBoxItem în timp ce urca în copac, este necesar să se instaleze și AncestorType = AncestorLevel = 3, lipsește astfel primele două ListBoxItem. În mod implicit, AncestorLevel este 1, iar căutarea se oprește la primul element găsit.

Expresia se leagă de elementul de date anterior din lista legată de date. Acest lucru poate fi utilizat într-un element de listă

Expresia se leagă de elementul la care se aplică șablonul. Acest mod funcționează numai dacă legătura se află în interiorul unui șablon de control sau al unui șablon de date

La prima vedere, proprietatea RelativeSource poate părea o complicație inutilă a marcajului. La urma urmei, de ce nu doar atașați direct la sursa de care aveți nevoie, utilizând proprietatea Source sau proprietatea ElementName? Cu toate acestea, acest lucru nu este întotdeauna posibil și, de obicei, deoarece obiectul sursă și obiectul țintă se află în diferite părți ale marcajului. Acesta este rezultatul creării de șabloane de control și șabloane de date. De exemplu, atunci când construiți un șablon de date care modifică modul în care elementele sunt reprezentate într-o listă, este posibil să aveți nevoie să accesați obiectul ListBox de nivel superior pentru a citi o proprietate a acestuia.

Proprietatea DataContext

În unele cazuri, există multe elemente legate de un obiect. De exemplu, luați în considerare următorul grup de elemente TextBlock, fiecare dintre ele utilizând expresia de legare originală pentru a extrage diverse detalii despre font, pictograme implicite, inclusiv spațierea liniei, stilul și greutatea primului set de căști (ambele sunt doar regulate). Puteți utiliza proprietatea Sursă pentru fiecare dintre ele, dar acest lucru duce la un marcaj destul de lung:

Într-o astfel de situație, ar fi mai clar și mai convenabil să determinați sursa legării odată ce ați utilizat proprietatea FrameworkElement.DataContext. În acest exemplu, este logic să setați proprietatea DataContext a elementului StackPanel care conține toate elementele TextBlock. (De asemenea, puteți seta proprietatea DataContext la un nivel chiar mai ridicat, de exemplu, la nivelul întregii ferestre, dar este mai bine să o definiți deja, pentru a vă exprima intențiile mai clar.)

Puteți seta proprietatea DataContext a unui element în același mod în care este setată proprietatea Binding.Source. Cu alte cuvinte, puteți încorpora un obiect, extrage-l dintr-o proprietate statică sau extrage-l dintr-o resursă, după cum se arată mai jos:

După aceasta, expresiile de legare sunt simplificate prin excluderea unor informații despre sursă:

Atunci când nu există nici o informație sursă în expresia obligatorie, WPF verifică proprietatea DataContext a elementului. Dacă este nulă, WPF arata în arborele elementelor pentru primul context de date, altele decât null. (Inițial, proprietățile DataContext ale tuturor elementelor sunt nulă.) Dacă este detectat un context de date adecvat, acesta este utilizat pentru legare. Dacă nu, expresia de legare nu transmite nicio valoare proprietății țintă.







Articole similare

Trimiteți-le prietenilor: