Adatkötés .NET módra – nem eléggé rugalmas
Azt nem kell senkinek ecsetelnem, hogy a .NET-et adatkötés, a DataBinding mennyire nagy szolgálatot tesz, mennyire megkönnyíti az objektumok és felhasználói felületek összekötését, a kapcsolat tipusos kezelését. De mégis belefutottunk tegnap egy hiányosságba és 4 munkaórányi problémamegoldás után el kellett vetnünk tervünket, más megoldást kellett keresni.
Az adatkötésben van egy kis automatizmus, mégpedig az, hogy a rendszer egy vezérlőhöz (UI elem) történő adatkötés során megpróbálja kitalálni, hogy melyik adatkötési mechanizmust akarjuk használni. Egészen pontosan, ha egy TextEdit
-hez szeretnénk egy property-t kötni, akkor két dolog történhet.
- Amennyiben a forrás objektum egy “sima” objektum, úgy az adatkötés a megnevezett (stringként átadott) property-hez megtörténik. Ha jól paramétereztük fel az adatkötést, akkor a beviteli mező változása a property-ben rögtön megjelenik és vica-versa.
- Ha a forrás objektum valamilyen gyűjtemény (
IList, IBindingList, Array
), akkor a megnevezett property, amihez kötni szeretnénk a gyűjtemény elemeiben kell, hogy létezzen. És az adatkötés is ide történik. List<Customer>-hez való adatkötésnél például a “Name
” propertynek aCustomer
osztályban kell léteznie. Ilyenkor (gyűjtemény esetén) a gyűjtemény elemét vizsgálja a databinding és ott keresi a property-t.
Ez utóbbi teljesen kézenfekvő, hiszen ha egy listát akarunk valahova kötni, akkor a lista egy oszlopát akarjuk valahova kötni. Első esetben egy PropertyManager
jön létre, utóbbi esetben pedig egy CurrencyManager
. Mindkettőn értelmezett a lépkedés, de az elsőn nincs nagyon értelme.
A mi problémánk viszont a következő. Nem tudjuk befolyásolni, nem tudjuk elérni, hogy egy gyűjtemény típusú forrás objektum adott property-jéhez kössünk vezérlőt. Egy listának is van Count
-ja. Ehhez nem tudtunk hozzákötni mondjuk egy Label-t, mert az adatkötés problémaként adta vissza nekünk, hogy a Customer
objektumnak nincs Count
-ja. De nem is oda akartunk kötni!!!
A probléma megoldása abban rejlik, hogy a property nevét nem szabad kitölteni. Ez már amolyan vicces dolog, hogy egy “változó” megadok a rá való hivatkozással, majd/és opcionálisan még stringként is hozzáírhatom a metódushoz a “változó” nevét.
Jó megoldás: label.DataBindigs.Add("Text", list.Count, "")
Nem jó megoldás: label.DataBindigs.Add("Text", list, "Count")
Hmm, állítólag WPF-ben az adatkötés jobb. Nemsokára úgyis indul egy WPF-es koncepció-projektünk, majd kiderül…