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.

  1. 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.
  2. 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 a Customer 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.

binding

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…