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; }
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
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
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
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.
1 2 3 |
public class Item { } |
2) Vytvorte verejne vlastnosti a soukrome promenne, ktere budou obsahovat data polozky.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
string header = ""; public string Header { get { return header; } set { header = value; } } string description = ""; public string Description { get { return description; } set { description = value; } } |
3) Napiste si tridu odvozenou od INotifyPropertyChanged, ktera muze vypadat treba takto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace W8Learn.DataControls { public class NotifyPropertyChanged : INotifyPropertyChanged { protected void OnPropertyChanged(object sourceClass, string propertyName) { if (PropertyChanged != null) { PropertyChanged(sourceClass, new PropertyChangedEventArgs(propertyName)); } } public event PropertyChangedEventHandler PropertyChanged; } } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public class Item : NotifyPropertyChanged { string header = ""; public string Header { get { return header; } set { OnPropertyChanged(this, "Header"); header = value; } } string description = ""; public string Description { get { return description; } set { OnPropertyChanged(this, "Description"); description = value; } } } |
5) Vytvorte tridu NotifyPropertyChangedCollection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; u sing System.Text; using System.Threading.Tasks; //-Jmenny prostor System.Reflection se musi importovat rucne using System.Reflection; namespace W8Learn.DataControls { class NotifyPropertyChangedCollection<t> : NotifyPropertyChanged { /// <summary> /// Musi to byt typ ObservableCollection protoze T implementuje rozhrani INotifyPropertyChanged, a s nim umi pracovat pouze ObservableCollection /// </summary> public ObservableCollection<t> Collection = new ObservableCollection<t>(); /// <summary> /// Nemuze byt staticka, protoze bych musel ke kazdemu volani metody zadavat i typ T /// </summary> /// <param name="propertyClass"> /// <param name="propertyName"> /// <returns> </returns> public string GetPropertyValue(object propertyClass, string propertyName) { object o = propertyClass.GetType().GetRuntimeProperty(propertyName).GetValue(propertyClass); if (o != null) { return o.ToString(); } return string.Empty; } } } </t> </t> </t> |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace W8Learn.DataControls { class ItemCollection : NotifyPropertyChangedCollection<Item> { public ItemCollection() { for (int i = 0; i < 100; i++) { Item item = new Item(); item.Header = "Polozka #" + i.ToString(); item.Description = ""; item.PropertyChanged += item_PropertyChanged; Collection.Add(item); } } void item_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { OnPropertyChanged(sender, e.PropertyName); } } } </Item> |
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.]]>