sobota 4. decembra 2010

Označenie položky v ListBoxe pomocou písania priamo do ListBoxu

Stiahnite si celý kód k spomínanej aplikácii 

Mnohokrát si užívateľ musí vybrať jednu položku z množstva v ponuke ListBox alebo ComboBox a je to nesmierne uľahčenie života, keď môže označiť požadovanú vec zo zoznamu priamym zadaním jednotlivých
písmen. Teda napríklad pri výbere krajiny zo zoznamu všetkých krajín sveta v ComboBoxe je najjednoduchšie označiť ComboBox a začať vyťukávať Slove... a to by už malo stačiť na označenie položky „Slovensko“ v zozname.

Nedávno som si naprogramoval malú utilitku na prehľadávanie (atď.) prednastavených farieb ktoré sú nadefinované v triede System.Windows.Media.Colors. Do ListBoxu som potom nasypal jednotlivé farby napojením ItemsSource na ObservableCollection triedy ColorVM (ktorá zastáva ViewModel jednotlivých farieb). Stiahnite si celý kód k spomínanej aplikácii


Nastavil som DataTemplate pre datový typ ColorVM aby jednotlivé objetky boli zobrazované v ListBoxe (a všade inde) ako obdĺžnik farebnej vzorky, vedľa ktorého je umiestnený text s názvom farby.
<DataTemplate DataType="{x:Type local:ColorVM}" >...

Takto nadefinovaný DataTemplate v App.xaml zaručuje že všetky objekty typu ColorVM v rámci aplikácie budú zdieľať rovnaký vzhľad. Prichystal som si aj políčko do ktorého užívateľ môže vpísať časťi názvu farbieb a ListBox sa podľa zadaného textu prefiltruje. Avšak, po označení ListBoxu som si všimol, že
sa nedajú označovať farby v ňom jednoduchým vyťukávaním názvu farby. Teda, ak by som dal Focus ListBoxu na obrázku, a začal vyťukávať „Toma“, položka s farbou „Tomato“ by sa neoznačila automaticky.

Ako teda donútiť ListBox (alebo ComboBox) aby označoval položky ako sme na to zvyknutí? ListBox v mojom príklade obsahuje objekty typu ColorVM a automatické označovanie položiek vieme že funguje pri
zoznamoch, v ktorých sú textové položky. Jednoduché riešenie teda aby aj náš zoznam sa dal prehľadávať automaticky postupným zadávaním písmen od začiatku slova nasleduje:

Stačí aby dátový typ jednotlivých položiek prekryl (override) metódu ToString. Keďže moja trieda ColorVM mala vlastnosť (property) Name, stačilo triedu ColorVM obohatiť o nasledovný kód:
public override string ToString()
{
return Name;
}
 
A hneď sa položky v našom ListBoxe dajú označovať automaticky vpísaním niekoľkých začiatočných písmen.

Stiahnite si celý kód k spomínanej aplikácii

Žiadne komentáre:

Zverejnenie komentára