GridView, ListView a ListBox – k cemu se kazdy z techto prvku hodi

V teto ukazce budu zkoumat moznosti techto 3 prvku. V kazdem ktery podporuje

Odvozeni GridView:
Object -> DependencyObject -> UIElement -> FrameworkElement -> Control -> ItemsControl -> Selector -> ListViewBase, ISemanticZoomInformation -> GridView

Odvozeni ListView:
Object -> DependencyObject -> UIElement -> FrameworkElement -> Control -> ItemsControl -> Selector -> ListViewBase, ISemanticZoomInformation -> ListView

Odvozeni ListBox:
Object -> DependencyObject -> UIElement -> FrameworkElement -> Control -> ItemsControl -> Selector -> ListBox

GridViewItem, ListViewItem a ListBoxItem maji svou nadrazenou hiearchii uplne stejnou a to sice tuto:
Object -> DependencyObject -> UIElement -> FrameworkElement -> Control -> ContentControl -> SelectorItem -> GridViewItem, ListViewItem, ListBoxItem

ListViewBase, ISemanticZoomInformation

Metody navic oproti tride Selector:

  • void CompleteViewChange()
  • void CompleteViewChangeFrom(SemanticZoomLocation, SemanticZoomLocation)
  • void CompleteViewChangeTo(SemanticZoomLocation source, SemanticZoomLocation destination)
  • IAsyncOperation LoadMoreItemsAsync()
  • void MakeVisible(SemanticZoomLocation item)
  • void ScrollIntoView(object item, ScrollIntoViewAlignment alignment)
  • void ScrollIntoView(object item)
  • void SelectAll()
  • void StartViewChangeFrom(SemanticZoomLocation source, SemanticZoomLocation destination)
  • void StartViewChangeTo(SemanticZoomLocation source, SemanticZoomLocation destination)
  • bool CanDragItems { set; get; }
  • bool CanReorderItems { set; get; }
  • double DataFetchSize { set; get; }
  • object Header { set; get; } – Je to skoro jako HeaderTemplate, akorat HeaderTemplate se nastavuje v XAMLu a Header v C# kodu, kde pouze vytvorite Content a priradite. Muzete takto treba programove menit hlavicku.
  • DataTemplate HeaderTemplate { set; get; } – Protoze ListView/GridView negeneruje hlavicku samo, musite si ji samy vytvorit pokud ji chcete. Opet – nedoporucuji provadet v C# ale v Xamlu. Nezapomente dat vsechen hlavickam stejnou sirku jako maji sloupce v ItemTemplate – toto si musite hlidat vy, program se o toto nestara.
  • TransitionCollection HeaderTransitions { set; get; }
  • double IncrementalLoadingThreshold { set; get; }
  • IncrementalLoadingTrigger IncrementalLoadingTrigger { set; get; }
  • bool IsActiveView { set; get; }
  • bool IsItemClickEnabled { set; get; }
  • bool IsSwipeEnabled { set; get; }
  • bool IsZoomedInView { set; get; }
  • IList SelectedItems { get; } – Vraci mi vybrane polozky, ktere uz pak staci pouze pretypovat na typ pouzivany v DataContext, abych mohl pouzivat vsechny metody typu.
  • ListViewSelectionMode SelectionMode { set; get; } – Muzete sem dat tyto hodnoty:

    None – zadna polozka nepujde vybrat, vsechny aktivni polozky vsak budou i nadale aktivni.
    Single – Pujde vybrat pouze 1 polozka. Pokud kliknete na jinou polozku nez byla vybrana, presune se zaskrtnuti na tuto polozku. Polozku odeberete stejne jako jste ji vybrali – tak ze na ni kliknete.
    Multiple – Klikem po jedne polozce muzete vybrat vice polozky, po opetovnem kliknuti danou polozku odeberete. Extended – Muzete vybrat vice polozek skrze shift nebo ctrl. Pokud mate vybrane polozky a kliknete na jinou polozku omylem, vybere se vam tato nova polozka.

  • SemanticZoom SemanticZoomOwner { set; get; }
  • event DragItemsStartingEventHandler DragItemsStarting
  • event ItemClickEventHandler ItemClick

Selector

Ma navic oproti tride ItemsControl tyto chranene polozky:

  • static bool GetIsSelectionActive(Windows.UI.Xaml.DependencyObject element)
  • bool? IsSynchronizedWithCurrentItem { set; get; }
  • int SelectedIndex { set; get; } – Co vraci – viz. tabulka nize
  • object SelectedItem { set; get; } – Co vraci – viz. tabulka nize
  • object SelectedValue { set; get; } – Co vraci – viz. tabulka nize
  • string SelectedValuePath { set; get; } – Muzete urcit, kterou vlastnost misto DataContext’;u misto cele polozky chcete vracet v SelectedValuePath.
  • event SelectionChangedEventHandler SelectionChanged

SelectionMode SelectedIndex SelectedItem SelectedValue SelectedValuePath
None -1 null null To co mu zadate, pri zmene vyberu polozek se nemeni
Single Index zvolene polozky Objekt zvolene polozky Objekt zvolene polozky To co mu zadate, pri zmene vyberu polozek se nemeni
Multiple Index prvni vybrane polozky Objekt prvni vybrane polozky Objekt prvni vybrane polozky To co mu zadate, pri zmene vyberu polozek se nemeni
Extended Index prvni vybrane polozky Objekt prvni vybrane polozky Objekt prvni vybrane polozky To co mu zadate, pri zmene vyberu polozek se nemeni

ItemsControl

Ma navic oproti tride Control:

  • void ClearContainerForItemOverride(DependencyObject element, object item)
  • DependencyObject GetContainerForItemOverride()
  • bool IsItemItsOwnContainerOverride(object item)
  • void PrepareContainerForItemOverride(Windows.UI.Xaml.DependencyObject element, object item)

Ma navic oproti tride ItemsControl tyto verejne polozky:

  • static ItemsControl GetItemsOwner(DependencyObject element)
  • static Windows.UI.Xaml.Controls.ItemsControl ItemsControlFromItemContainer(Windows.UI.Xaml.DependencyObject container)
  • string DisplayMemberPath { set; get; }
  • IObservableVector GroupStyle { get; }
  • GroupStyleSelector GroupStyleSelector { set; get; }
  • bool IsGrouping { get; }
  • ItemContainerGenerator ItemContainerGenerator { get; }
  • Style ItemContainerStyle { set; get; }
  • StyleSelector Ite mContainerStyleSelector { se t; get; }
  • TransitionCollection ItemContainerTransitions { set; get; }
  • ItemCollection Items { get; } – Pokud chcete pridavat primo polozky odvozene od ListBoxItem/ListViewItem/GridViewItem. Nicmene ja tuto cestu nedoporucuji, viz nize.
  • ItemsPanelTemplate ItemsPanel { set; get; } – Sablona prvku, ktere se nactou z ItemsSource.
  • object ItemsSource { set; get; } – Objekt ObservableCollection obsahujici jednotlive polozky, ktere si uzivatel preje zobrazit.
  • DataTemplate ItemTemplate { set; get; } – Sablona jedne polozky.
  • DataTemplateSelector ItemTemplateSelector { set; get; } – slouzi k dynamickemu prirazeni ruznych DataTemplate podle ruznych vlastnosti. Pro vice informaci se kouknete na http://stackoverflow.com/questions/2302250/how-to-style-different-items-differently-when-using-data-template-in-xaml/2304265#2304265

Control

O zadne prvky tridy Control se zde nebudeme vice zabyvat.

FrameworkElement

Z teto tridy zde budu zkoumat pouze jednu vlastnost:

  • object DataContext { set; get; } – objekt, ze ktereho se nacitaji pri DataBinding’u jednotlive vlastnosti.

GridView

Hodi se kdyz:
Zobrazujete veci horizontalne

Nehodi se kdyz:
Potrebujete kompabilitu s klasickymi prvky .NETu

Metody navic oproti tride ListViewBase: zadne

ListView

Hodi se kdyz:
Zobrazujete veci vertikalne

Nehodi se kdyz:
Potrebujete kompabilitu s klasickymi prvky .NETu

Metody navic oproti tride ListViewBase: zadne

ListBox

Hodi se kdyz:
Potrebujete zpetnou kompatibilitu

Nehodi se kdyz:
Prvek musi byt optimalizovany pro dotykove ovladani

Metody navic oproti tride Selector:

  • void ScrollIntoView(object item) –
  • void SelectAll()
  • IList>object<
    SelectedItems { get; }

  • SelectionMode SelectionMode { set; get; }
  • SelectorItem

    Ma navic tyto vlastnosti oproti polozce ContentControl:

    • bool IsSelected { get; set; }

    GridViewItem

    Ma navic oproti tride SelectorItem:

    • ListViewItemTemplateSettings TemplateSettings { get; }

    Bezne se od teto tridy neodvozuje a nepise se prezentacni kod v C#. Misto toho se pouze vytvori trida se verejnymi vlastnostmi a dale se namapuji tyto vlastnosti pomoci DataBinding’u na sablonu, kterou mate v … XAML kod sablony …

    ListViewItem

    Ma navic oproti tride SelectorItem:

    • ListViewItemTemplateSettings TemplateSettings { get; }

    Bezne se od teto tridy neodvozuje a nepise se prezentacni kod v C#. Misto toho se pouze vytvori trida se verejnymi vlastnostmi a dale se namapuji tyto vlastnosti pomoci DataBinding’u na sablonu, kterou mate v … XAML kod sablony …

    ListBoxItem

    Ma navic oproti tride SelectorItem: nic

    Bezne se od teto tridy neodvozuje a nepise se prezentacni kod v C#. Misto toho se pouze vytvori trida se verejnymi vlastnostmi a dale se namapuji tyto vlastnosti pomoci DataBinding’u na sablonu, kterou mate v … XAML kod sablony …

    Tridy dedici od INotifyPropertyChanged

    Zakladem tohoto navodu je implementovat jak ve tridu jednoho polozky tak u obalujici kolekce teto tridy.
    1) Prvnim krokem je tedy definovat tridu polozky.

    2) Vytvorte verejne vlastnosti a soukrome promenne, ktere budou obsahovat data polozky.

    3) Napiste si tridu odvozenou od INotifyPropertyChanged, ktera muze vypadat treba takto:

    4) Odvodte od teto vytvorene tridy vasi tridu polozky a doplnte volani OnPropertyChanged() do set’u kazde vlastnosti, na kterou chcete byt upozornovan pokud se zmeni.

    5) Vytvorte tridu NotifyPropertyChangedCollection , kde T bude typ polozky. Tuto tridu muzete pouzivat pri vsech kolekcich okolo prvku, ktere implementuji INotifyPropertyChanged.

    6) Napiste tridu ItemCollection – obalujici tridu na polozky. Pridejte do jeji promenne kolekce kazdou polozku a kazde polozce priradte stejny handler udalosti – metodu OnPropertyChanged v teto tride. Je to sice zde zbytecne protoze ve W8 se po updatu vlastnosti Text controlu TextBlock se tento novy text nevykresli, ale v klasicke WPF aplikaci by se vykreslil.

    7) To je vsechno. Nyni uz jen u GridView/ListView/ListBox priradte do vlastnosi ItemsSource tuto vlastnost Collection vytvorene tridy ItemCollection a nastavte mod data bindingu u prvku ktere chcete ukladat do tridy Item na TwoWay.]]>

    Leave a Reply

    Your email address will not be published. Required fields are marked *