ObjectDataProvider - et must for seriøs databinding
DataBinding i WPF er kraftfuldt. Alt kan bindes på kryds og tværs - hvilket er lidt et tve-ægget sværd. Hvis man først begynder at være afhængigt af det, kan man brænde nallerne noget så eftertrykkeligt, når man nu får Bindingen til at holde op med at fungere.
For at nævne et par typiske scenarier:
- Bindingen bliver overskrevet af en aktuel tildeling af værdi.
- Det underliggende object nulles eller erstattet af et andet
Hvis for eksempel du har bundet en TextProperty op på en given property i detail-delen af et master-detail setup og den aktuelt valgte værdi i master-delen skifter, forsvinder bindingen samme sted hen som det tidligere valgte objekt… og pludselig bliver detail-delen ikke opdateret længere.
*stor fanfare* ObjectDataProvider (ODP) er din ven. Den kan ikke hjælpe dig, hvis du får overskrevet bindingen, men især i master-detail scenarier spiller den max. Ideen med ODP er at man har en mellemstation imellem det aktuelle objekt og det der skal bindes fra. TextBoxen peger dermed altid på det samme objekt, mens objekt instansen skiftes på ODP (.ObjectInstance = _newValue;). Det beskytter bindingen fra at pege på et null-objekt eller et out-of-date objekt.
Derudover implementerer ODP INotifyCollectionChanged, hvilket vil sige, at hvis man har en samling af objekter, som man tilføjer, sletter og omarrangerer vil disse ‘boble’ op i UI uden at man i den sammenhæng skal gøre noget aktivt.
Tricket til at få ODP til at virke er, at de objekter man putter i ObjectInstance helst skal implementere INotifyPropertyChanged (enkelt instanser) og INotifyCollectionChanged for samlinger. Hvis det er kontrollen selv, der tilføjer, fjerner osv. er dette dog ikke nødvendigt. Derudover skal man sørge for at Binde på ODP’en og ikke objekt instansen, da man ellers er tilbage ved punkt et.
En anden pointe er, at jo færre ODP’er man har i spil, jo nemmere er alle opdateringsscenarier. Husk på at den kan håndtere vilkårligt dybe Path’s ned i objektgrafen og INotifyPropertyChanged vil stadig virke. I vores løsning på arbejde er vi nede i 5te niveau fra hovedobjektet uden problemer. Derudover kan man Binde dem til hinanden, så man ikke engang behøver håndtere events, når master-delen i master-detail scenarier skifter.
Dokumentationen på ODP er omfangsrig - start på MSDN og læs bagefter Beatriz Costa’s indlæg (www.beacosta.com). Det giver et rigtig godt udgangspunkt.