Wpf, ugrás az objektumokra
Amikor egy olyan elemhez kötődik, amely nem elem, akkor el kell hagynia a Binding.ElementName tulajdonságot, és helyettesítenie kell az alábbi tulajdonságok egyikét:
Jelzi a RelativeSource objektumot használó forrásobjektumot, amely lehetővé teszi az aktuális elem hivatkozását. Ez egy speciális eszköz, amely alkalmas vezérlő sablonok és adat sablonok írására.
Ha a forrást a Forrás tulajdonság vagy a Relatív forrás tulajdonság nem adja meg, akkor a WPF környezet elemzi az elemfát az aktuális elemtől kezdődően. Ellenőrzi az egyes elemek DataContext tulajdonságát, és az elsőt használja, amely nem nulla. A DataContext tulajdonság rendkívül hasznos, ha egy objektum több tulajdonságát meg kell kötni a különböző elemekhez, mivel egy magas szintű konténerobjektum DataContext tulajdonságát állíthatja be, nem pedig közvetlenül a célelemre.
Az alábbiakban részletesebben ismertetjük ezeket a lehetőségeket.
A Forrás tulajdonság
A Forrás tulajdonság egyszerű. Az egyetlen olyan szempont, amelyet figyelembe kell venni, hogy az adat objektumot kötelezővé kell tenni a kötéshez. Ahogyan az látható, számos megközelítés létezik egy adatobjektum megszerzéséhez: kivonni egy erőforrásból, programilag létrehozni vagy letölteni egy adatszolgáltatótól.
A legegyszerűbb megoldás a forrás telepítése néhány kész és hozzáférhető statikus objektumba. Például létrehozhat egy statikus objektumot a kódban, és használhatja. Alternatív megoldásként alkalmazhatja az összetevőt a .NET osztálykönyvtárból, az alábbiak szerint:
Ez a kötelező kifejezés egy FontFamily objektumot kap, amelyet a SystemFonts.IconFontFamily tulajdonság biztosít. (Vegye figyelembe, hogy a Binding.Source tulajdonság telepítése a Static Markup Extension segítségével szükséges.) Ezután a Binding.Path tulajdonság a FontFamily.Source tulajdonságra van állítva, amely megadja a betűtípus családnevét. Az eredmény egyetlen szövegsor. Windows Vista vagy Windows 7 esetén a betűtípus neve Segoe UI.
Egy másik lehetőség az előzőleg erőforrásként létrehozott objektumhoz való kötődés. Például a következő jelölés létrehoz egy FontFamily objektumot, amely a Calibri betűtípushoz utal:
Relatív forrás tulajdonság
A RelativeSource tulajdonság lehetővé teszi a forrásobjektumnak a célobjektumhoz való viszonya alapján történő beállítását. Például a RelativeSource tulajdonságot arra használhatja, hogy egy elemet magához köti, vagy egy olyan szülőelemhez köthessen, amely ismeretlen számú, az elemfán magasabb szinttel rendelkezik.
A Binding.RelativeSource tulajdonság beállításához használja a RelativeSource objektumot. Ez némileg bonyolítja a szintaxist, mivel létre kell hoznia egy kötő objektumot és belsejében egy beágyazott relatív forrás objektumot. Az egyik lehetőség az, hogy az Objektum beállítás szintaxist használja a Kötés jelölő kiterjesztése helyett.
Például a következő kód létrehoz egy Kötvény objektumot a TextBlock.Text tulajdonsághoz. A Binding objektum a RelativeSource-ot használja, amely a szülőablakot keresi és megjeleníti az ablak címét:
A RelativeSource objektum esetében a FindAncestor mód van kiválasztva, ami arra készteti, hogy felkeresse az elemfát, amíg az AncestorType tulajdonság által meghatározott elemtípus nem található meg.
A kötés legáltalánosabb módja az, hogy azt egy sorban egyesítsük, a Binding és RelativeSource jelölőbővítmények használatával, az alábbiak szerint:
A FindAncestor mód egy lehetséges opció közül az egyik a RelativeSource objektum létrehozásakor. Minden lehetőséget röviden ismertetünk:
Egy kifejezés egy adott elem másik tulajdonságára van kötve
A kifejezés a szülőelemhez van kötve. A WPF felkutatja az elemfát, amíg meg nem találja a kívánt szülőelemet. A szülő megadásához meg kell adni az AncestorType tulajdonságot is, hogy jelezze a talált szülőelem típusát. Ezenkívül az AncestorLevel tulajdonság használatával kihagyhat bizonyos számú egyezést a megadott elemhez. Például, hogy kötődnek a harmadik elem ListBoxItem típusú míg felkapaszkodott a fára, meg kell telepíteni és AncestorType = AncestorLevel = 3, tehát hiányzik az első két ListBoxItem. Alapértelmezés szerint az AncestorLevel 1, és a keresés az első talált elemen megáll.
A kifejezés az adathoz kötött listán az előző adatelemhez kötődik. Ezt egy listaelemben lehet használni
A kifejezés az elemhez kötődik, amelyre a sablont alkalmazzák. Ez az üzemmód csak akkor működik, ha a kötés egy vezérlő sablon vagy egy adat sablon belsejében van
Első pillantásra a RelativeSource tulajdonság úgy tűnhet, hogy a jelölés felesleges szövődménye. Végül is, miért nem csak közvetlenül a szükséges forráshoz kell csatolnia a Forrás tulajdonság vagy az ElementName tulajdonság használatával? Ez azonban nem mindig lehetséges, és általában azért, mert a forrásobjektum és a célobjektum a jelölés különböző részein található. Ez az eredmény vezérlő sablonok és adatsablonok létrehozásakor. Például, amikor olyan adatbázist hoz létre, amely megváltoztatja az elemek megjelenítésének módját a listában, előfordulhat, hogy hozzá kell férnie a legfelső szintű ListBox-objektumhoz, hogy olvassa el néhány tulajdonságát.
DataContext tulajdonság
Bizonyos esetekben sok elem kapcsolódik egy objektumhoz. Például vegye figyelembe a következő csoportot a TextBlock elemek közül, amelyek mindegyike az eredeti kötési kifejezést használja a különböző fontok betöltésére, az alapértelmezett ikonokra, beleértve az első fülhallgató sorát, stílusát és súlyát (mindkettő csak a rendszeres). Használhatja a Forrás tulajdonságot mindegyikhez, de ez elég hosszú jelölést eredményez:
Ilyen helyzetben a FrameworkElement.DataContext tulajdonság használatával egyértelműbb és kényelmesebb lenne meghatározni a kötés forrását. Ebben a példában érdemes beállítani a StackPanel elem DataContext tulajdonságát, amely tartalmazza az összes TextBlock elemet. (A DataContext tulajdonságot még magasabb szintre is beállíthatja, például a teljes ablak szintjén, de jobb, ha a lehető legszorosabban meghatározná a szándékokat.)
Egy elem DataContext tulajdonságát ugyanúgy állíthatja be, mint a Binding.Source tulajdonság beállítva. Más szóval, beágyazhat egy objektumot, kiválaszthatja azt egy statikus tulajdonságból, vagy letöltheti azt egy erőforrásból, az alábbiak szerint:
Ezután a kötődési kifejezéseket egyszerűsítik, kizárva néhány információt a forrásról:
Ha nincs forrás információ a kötési kifejezésben, akkor a WPF ellenőrzi az elem DataContext tulajdonságát. Ha ez nulla, akkor a WPF az elemek fájljában az elsõ adatkonfliktuson kívül jelenik meg. (Kezdetben az összes elem DataContext tulajdonságai nulláznak.) Ha megfelelő adatkontaktust észlel, akkor a kötéshez használják. Ha nem, akkor a kötési kifejezés nem ad át semmilyen értéket a cél tulajdonságnak.