Binding source a jeho použití

V minulém příspěvku jsem se věnoval propojení objektu BindingSource s LINQ to SQL. Jelikož z několika příspěvků, týkajících se bindování dat na zobrazovací prvky vyplívá, že ne všichni jsou s objektem BindingSource plně srozuměni, rád bych napsal krátký návod, jak jej použít.

Co je BindingSource

Z pohledu 10000 stop si můžeme představit BindingSource jako komponentu, která poskytuje rozhraní mezi daty a vázanými prvky uživatelského rozhraní. Požití je tedy takové, že komponenta přebírá jako svůj datový zdroj data ze servisní, nebo datové vrtstvy a na tuto komponentu jsou poté navázány zobrazovací prvky. Tím, že vložíme mezi data a zobrazovací prvky komponentu BindingSource, umožní nám to vložit zároveň s tím i služby (události, metody a vlastnosti), které nemusí poskytovat data samotná.

Pokud se sneseme o něco níže a podíváme se na komponentu zblízka, zjistíme, že BindingSource obaluje třídu CurrencyManager a přidává několik dalších "vychytávek", které nám umožňují snažší práci s uživatelským rozhraním. Ti, kdož si pamatují práci s CurrencyManager případně třídou BindingManagerBase ve verzích .net frameworku 1.x, uvidí poměrně velký krok kupředu a ulehčení práce.

Co vývojáři přinese použití BindingSource

Určitě si každý nyní řekne, proč vlastně takovou komponentu používat, vždyť bindovat uživatelské prvky na data mohu i tak, proč tedy používat nějaký další prvek, který mi vše může znepřehlednit. Opak je spíše pravdou, právě díky tomu, že mezi data a UI vložíme tuto abstraktní vrstvu, získáme několik výhod, které nemusí být na první pohled patrné.

IBindingList

Prvním přínosem je zpřístupnění interface IBindingList i pro seznamy, které toto rozhraní nepodporují. Pokud se podíváte na toto rozhraní, zjistíte, že poskytuje hned několik metod a vlastností, které můžete využít při bindování třeba na DataGridView, jak bylo zmíněno v předchozím příspěvku.

Jenže zpřístupněním samotného rozhraní vše nekončí, naopak, máme k dispozici ještě něco více a to ve spojistosti právě s rozhraním IBindingList. Je to metoda AddingNew, která se vyvolá v okamžiku, kdy je zažádáno o přidání nového objektu do seznamu. Přihlášení k odběru k této události využijeme třeba v případě, kdy objekty tvoříme přes nějakou factory třídu a chceme mít tak vytváření nových instancí plně pod kontrolou.

Zabalený CurrencyManager

Jak jsem se již zmínil výše, BindingSource nám obaluje dříve používanou třídu CurrencyManager a tím také vyvolávání událostí CurrentChanged a PositionChanged. Nyní se tak k těmto událostem dostaneme přehledněji a z jednoho místa, ale nejedná se jen o zmíněné události ale též metody a vlastnosti CurrencyManagera.

Mezi ty, které bylo nutné používat patřily metody ResumeBinding a SuspendBinding, jenže ty měly efekt pouze na tzv. Simple binding, tedy bindování na jednoduché prvky (např. TextBox). Použitím komponenty BindingSource se vše zjednodušilo a nastavením vlastnosti RaiseListChangedEvents na hodnotu false se zruší bindování jak na jednoduché prvky, tak i na prvky komplexní, jako je třeba DataGridView.

Pro ty, kteří rádi vidí pod pokličku uvedu, že k přerušení bindování dojde z toho důvodu, že přestane být vyvolávána metoda ListChanged.

Tváří se typově

Lépe to vystihnout nedokáži, ale lepší, než kdyby se tvářil kysele, že? Co si pod tím pojmem představit? Pokud chcete v design time navrhnout vzhled a rozmístění ovládacích prvků, potřebujete vědět, na co mají být prvky navázány - jakého typu bude daný objekt. Obdobně pak třeba u DataGridView, když chcete bindovat sloupečky. A právě proto je tu BindingSource, aby vám ulehčil vaši činnost. Stačí jako datový zdroj uvést

bindingSource.DataSource = typeof(MujObjekt);

a rázem vám jsou zpřístupněny vlastnosti objektu MujObjekt. Tudíž BindingSource se tváří, jako by byl instancí tohoto objektu.

Zjednodušuje binding

neříkejte mi, že jsem to neříkal celou dobu. Dostávám se k poslednímu bodu, že se vám to zdá podivné, když vše předchozí uvedené zjednodušilo binding už dostatečně?  Jenže, kdo by nechtěl ještě víc.

Určitě znáte ten klasický scénář, kdy si vrátíte objekty s daty z nějaké služby a ty přímo nabindujete na zobrazovací prvky. Poté však zjistíte, že musíte napsat spoustu obslušného kódu okolo, protože tyto objekty a bindování na ně není stálé. A tak vám samotné použití designeru nestačí, musíte se vrhnout do kódu a přepisovat již jednou vytvořené.

Jenže nyní již nemusíte, víte, že existuje komponenta BindingSource, která je vám nápomocná při zobrazování a editaci dat a tak použijete ji jako datový zdroj k bindování.

V jednoduchosti je síla

Právě v jednoduchosti a snadnosti použití komponenty BindingSource je síla, kterou můžete využít ve svůj prospěch. Není snad nic lepšího pro vývojáře, než mít snadno čitelný a udržovatelný kód a k tomu právě BindingSource přispívá. Snad vám k tomu pomohl i tento článek.

Add a Comment