Podsumowanie rozdziału 19. Widoki kolekcji
Uwaga
Ta książka została opublikowana wiosną 2016 roku i od tego czasu nie została zaktualizowana. Jest wiele w książce, która pozostaje cenna, ale niektóre materiały są nieaktualne, a niektóre tematy nie są już całkowicie poprawne ani kompletne.
Xamarin.Forms definiuje trzy widoki, które utrzymują kolekcje i wyświetlają swoje elementy:
Picker
jest stosunkowo krótką listą elementów ciągów, które pozwalają użytkownikowi wybrać jedenListView
jest często długą listą elementów zwykle tego samego typu i formatowania, co pozwala również użytkownikowi wybrać jedenTableView
to kolekcja komórek (zwykle różnych typów i wyglądów) do wyświetlania danych lub zarządzania danymi wejściowymi użytkownika
Aplikacje MVVM są często używane ListView
do wyświetlania wybranej kolekcji obiektów.
Opcje programu z selektorem
Jest Picker
to dobry wybór, gdy musisz zezwolić użytkownikowi na wybór opcji spośród stosunkowo krótkiej string
listy elementów.
Selektor i obsługa zdarzeń
W przykładzie PickerDemo pokazano, jak używać języka XAML do ustawiania Title
Picker
właściwości i dodawania string
Items
elementów do kolekcji. Gdy użytkownik wybierze Picker
element , wyświetla elementy w Items
kolekcji w sposób zależny od platformy.
Zdarzenie SelectedIndexChanged
wskazuje, kiedy użytkownik wybrał element. Następnie właściwość oparta na SelectedIndex
zerach wskazuje wybrany element. Jeśli żaden element nie jest zaznaczony, SelectedIndex
równa się –1.
Można również użyć SelectedIndex
polecenia , aby zainicjować wybrany element, ale należy go ustawić po wypełnieniu Items
kolekcji. W języku XAML oznacza to, że prawdopodobnie użyjesz elementu właściwości do ustawienia SelectedIndex
.
Powiązanie danych selektora
Właściwość SelectedIndex
jest wspierana przez właściwość, którą można powiązać, ale Items
nie, więc użycie powiązania danych z elementem Picker
jest trudne. Jednym z rozwiązań jest użycie Picker
elementu w połączeniu z elementem ObjectToIndexConverter
takim jak Xamarin.Formsw bibliotece Book.Toolkit. SelektorBinding pokazuje, jak to działa.
Uwaga
Teraz Xamarin.FormsPicker
zawiera ItemsSource
właściwości i SelectedItem
, które obsługują powiązanie danych. Zobacz Selektor.
Renderowanie danych za pomocą kontrolki ListView
Jest ListView
to jedyna klasa, która pochodzi z, z ItemsView<TVisual>
której dziedziczy ItemsSource
właściwości i ItemTemplate
.
ItemsSource
jest typu IEnumerable
, ale domyślnie null
musi być jawnie zainicjowany lub (częściej) ustawiony na kolekcję za pomocą powiązania danych. Elementy w tej kolekcji mogą być dowolnego typu.
ListView
SelectedItem
Definiuje właściwość, która jest ustawiona na jeden z elementów w ItemsSource
kolekcji lub null
jeśli żaden element nie jest zaznaczony. ListView
uruchamia zdarzenie po wybraniu ItemSelected
nowego elementu.
Kolekcje i wybory
Przykład ListViewList wypełnia ListView
17 Color
wartości w List<Color>
kolekcji. Elementy można wybierać, ale domyślnie są wyświetlane z ich nieatrakcyjnymi ToString
reprezentacjami. Kilka przykładów w tym rozdziale pokazuje, jak naprawić ten wyświetlacz i uczynić go tak atrakcyjnym, jak to konieczne.
Separator wierszy
Na wyświetlaczach systemów iOS i Android linia cienka oddziela wiersze. Możesz to kontrolować za SeparatorVisibility
pomocą właściwości i SeparatorColor
. SeparatorVisibility
właściwość jest typu SeparatorVisibility
, wyliczenie z dwoma elementami członkowskimi:
Powiązanie danych wybranego elementu
Właściwość SelectedItem
jest wspierana przez właściwość, którą można powiązać, więc może być źródłem lub elementem docelowym powiązania danych. Jego wartością domyślną BindingMode
jest OneWayToSource
, ale ogólnie jest to element docelowy powiązania danych dwukierunkowego, szczególnie w scenariuszach MVVM. Przykład ListViewArray demonstruje tego typu powiązanie.
Różnica w obserwowalnej kolekcji
Przykład ListViewLogger ustawia ItemsSource
właściwość ListView
obiektu na List<DateTime>
kolekcję, a następnie stopniowo dodaje nowy DateTime
obiekt do kolekcji co sekundę przy użyciu czasomierza.
Nie powoduje to jednak automatycznej aktualizacji, ListView
ponieważ List<T>
kolekcja nie ma mechanizmu powiadamiania wskazującego, kiedy elementy są dodawane do kolekcji lub usuwane z niej.
W przestrzeni nazw zdefiniowano ObservableCollection<T>
znacznie lepszą klasę System.Collections.ObjectModel
do użycia w takich scenariuszach. Ta klasa implementuje INotifyCollectionChanged
interfejs i w związku z tym uruchamia CollectionChanged
zdarzenie, gdy elementy są dodawane lub usuwane z kolekcji albo gdy są zastępowane lub przenoszone w kolekcji. ListView
Gdy wewnętrznie wykryje, że implementacja INotifyCollectionChanged
klasy została ustawiona na jej ItemsSource
właściwość, dołącza program obsługi do CollectionChanged
zdarzenia i aktualizuje jego wyświetlanie po zmianie kolekcji.
Przykład ObservableLogger demonstruje użycie metody ObservableCollection
.
Szablony i komórki
Domyślnie element ListView
jest wyświetlany w kolekcji przy użyciu metody każdego elementu ToString
. Lepsze podejście polega na zdefiniowaniu szablonu w celu wyświetlenia elementów.
Aby eksperymentować z tą funkcją, możesz użyć NamedColor
klasy w bibliotece Xamarin.FormsBook.Toolkit. Ta klasa definiuje statyczną All
właściwość typu IList<NamedColor>
, która zawiera 141 NamedColor
obiektów odpowiadających publicznym polam Color
struktury.
Przykład NaiveNamedColorList ustawia właściwość ItemsSource
na ListView
tę NamedColor.All
właściwość, ale wyświetlane są tylko w pełni kwalifikowane nazwy NamedColor
klas obiektów.
ListView
wymaga szablonu do wyświetlenia tych elementów. W kodzie można ustawić ItemTemplate
właściwość zdefiniowaną DataTemplate
przez ItemsView<TVisual>
obiekt przy użyciu DataTemplate
konstruktora, który odwołuje się do pochodnej Cell
klasy. Cell
ma pięć pochodnych:
TextCell
— zawiera dwaLabel
widoki (mówiąc koncepcyjnie)ImageCell
— dodajeImage
widok doTextCell
EntryCell
— zawieraEntry
widok zLabel
SwitchCell
— zawiera obiektSwitch
zLabel
ViewCell
— może być dowolnyView
(prawdopodobnie z dziećmi)
Następnie wywołaj SetValue
metodę DataTemplate
i SetBinding
na obiekcie, aby skojarzyć wartości z właściwościami Cell
lub ustawić powiązania danych we Cell
właściwościach odwołujące się do właściwości w ItemsSource
kolekcji. Jest to pokazane w przykładzie TextCellListCode .
Gdy każdy element jest wyświetlany przez ListView
element , małe drzewo wizualne jest tworzone na podstawie szablonu, a powiązania danych są ustanawiane między elementem a właściwościami elementów w tym drzewie wizualnym. Możesz zapoznać się z tym procesem, instalując programy obsługi dla ItemAppearing
zdarzeń ListView
i ItemDisappearing
programu , lub używając alternatywnego DataTemplate
konstruktora używającego funkcji wywoływanej za każdym razem, gdy należy utworzyć drzewo wizualne elementu.
TextCellListXaml pokazuje funkcjonalnie identyczny program całkowicie w języku XAML. DataTemplate
Tag jest ustawiony na ItemTemplate
właściwość ListView
, a następnie TextCell
parametr jest ustawiony na DataTemplate
wartość . Powiązania z właściwościami elementów w kolekcji są ustawiane bezpośrednio we Text
właściwościach i Detail
obiektu TextCell
.
Komórki niestandardowe
W języku XAML można ustawić element na ViewCell
DataTemplate
wartość , a następnie zdefiniować niestandardowe drzewo wizualne jako View
właściwość ViewCell
. (View
jest właściwością ViewCell
zawartości, więc ViewCell.View
tagi nie są wymagane). Przykład CustomNamedColorList pokazuje tę technikę:
Uzyskanie odpowiedniego rozmiaru dla wszystkich platform może być trudne. Właściwość RowHeight
jest przydatna, ale w niektórych przypadkach warto uciekać się do HasUnevenRows
właściwości, która jest mniej wydajna, ale wymusza ListView
rozmiar wierszy. W przypadku systemów iOS i Android należy użyć jednej z tych dwóch właściwości, aby uzyskać odpowiednie rozmiary wierszy.
Grupowanie elementów ListView
ListView
obsługuje grupowanie elementów i nawigowanie między tymi grupami. Właściwość musi być ustawiona ItemsSource
na kolekcję kolekcji: obiekt ItemsSource
ustawiony na musi implementować IEnumerable
element , a każdy element w kolekcji musi również implementować IEnumerable
element . Każda grupa powinna zawierać dwie właściwości: opis tekstowy grupy i trzyliterowy skrót.
Klasa NamedColorGroup
w bibliotece Xamarin.FormsBook.Toolkit tworzy siedem grup NamedColor
obiektów. W przykładzie ColorGroupList pokazano, jak używać tych grup z właściwością ListView
ustawioną IsGroupingEnabled
na true
, a właściwości i GroupDisplayBinding
GroupShortNameBinding
powiązane z właściwościami w każdej grupie.
Niestandardowe nagłówki grup
Istnieje możliwość utworzenia niestandardowych nagłówków dla ListView
grup, zastępując GroupDisplayBinding
właściwość GroupHeaderTemplate
definicją szablonu nagłówków.
ListView i interakcyjność
Zazwyczaj aplikacja uzyskuje interakcję użytkownika z ListView
obiektem przez dołączenie procedury obsługi do ItemSelected
zdarzenia lub ItemTapped
przez ustawienie powiązania danych we SelectedItem
właściwości. Jednak niektóre typy komórek (EntryCell
i SwitchCell
) umożliwiają interakcję użytkownika i możliwe jest również utworzenie komórek niestandardowych, które same wchodzą w interakcję z użytkownikiem. Element InteractiveListView tworzy 100 wystąpień ColorViewModel
elementu i umożliwia użytkownikowi zmianę każdego koloru przy użyciu trio Slider
elementów. Program korzysta również z biblioteki ColorToContrastColorConverter
Xamarin.FormsBook.Toolkit.
ListView i MVVM
ListView
odgrywa dużą rolę w scenariuszach MVVM. IEnumerable
Zawsze, gdy kolekcja istnieje w modelu ViewModel, często jest powiązana z elementem ListView
. Ponadto elementy w kolekcji często implementują INotifyPropertyChanged
powiązanie z właściwościami w szablonie.
Kolekcja modelu ViewModel
Aby to zbadać, biblioteka SchoolOfFineArts tworzy kilka klas na podstawie pliku danych XML i obrazów fikcyjnych uczniów w tej fikcyjnej szkole.
Klasa Student
pochodzi z klasy ViewModelBase
. Klasa StudentBody
jest kolekcją Student
obiektów, a także pochodzi z klasy ViewModelBase
. Obiekt SchoolViewModel
pobiera plik XML i tworzy wszystkie obiekty.
Program StudentList używa elementu do ImageCell
wyświetlania uczniów i ich obrazów w obiekcie ListView
:
Przykład ListViewHeader dodaje właściwość, Header
ale jest wyświetlana tylko w systemie Android.
Wybór i kontekst powiązania
Program SelectedStudentDetail wiąże BindingContext
obiekt z StackLayout
właściwością SelectedItem
ListView
. Dzięki temu program może wyświetlać szczegółowe informacje o wybranym uczniu.
Menu kontekstowe
Komórka może definiować menu kontekstowe implementowane w sposób specyficzny dla platformy. Aby utworzyć to menu, dodaj MenuItem
obiekty do ContextActions
właściwości .Cell
MenuItem
definiuje pięć właściwości:
Text
typustring
Icon
typuFileImageSource
IsDestructive
typubool
Command
typuICommand
CommandParameter
typuobject
Właściwości Command
i CommandParameter
oznaczają, że model ViewModel dla każdego elementu zawiera metody wykonywania żądanych poleceń menu. W scenariuszach innych MenuItem
niż MVVM definiuje Clicked
również zdarzenie.
KomórkaContextMenu demonstruje tę technikę. Właściwość Command
każdego z nich MenuItem
jest powiązana z właściwością typu ICommand
w Student
klasie. IsDestructive
Ustaw właściwość na true
wartość dla MenuItem
obiektu, który usuwa lub usuwa zaznaczony obiekt.
Różnicowanie wizualizacji
Czasami potrzebne są niewielkie różnice w wizualizacjach elementów w ListView
obiekcie na podstawie właściwości. Na przykład gdy średnia punktu oceny ucznia spadnie poniżej 2,0, przykład ColorCodedStudents wyświetla nazwę tego ucznia na czerwono.
Jest to realizowane za pomocą konwertera wartości powiązania , ThresholdToObjectConverter
w Xamarin.Formsbibliotece Book.Toolkit.
Odświeżanie zawartości
Funkcja ListView
obsługuje gest ściągania na potrzeby odświeżania danych. Program musi ustawić właściwość , IsPullToRefresh
aby true
to włączyć. Funkcja ListView
odpowiada na gest ściągania, ustawiając jej IsRefreshing
właściwość na true
, i przez wywołanie Refreshing
zdarzenia i (w przypadku scenariuszy MVVM) wywołania Execute
metody jej RefreshCommand
właściwości.
Kod obsługujący Refresh
zdarzenie lub RefreshCommand
ewentualnie aktualizuje dane wyświetlane przez ListView
element i ustawia wartość IsRefreshing
.false
Przykład RssFeed demonstruje użycie obiektu RssFeedViewModel
, który implementuje RefreshCommand
i IsRefreshing
właściwości powiązania danych.
Element TableView i jego intencje
ListView
Chociaż zazwyczaj wyświetla wiele wystąpień tego samego typu, TableView
zwykle koncentruje się na dostarczaniu interfejsu użytkownika dla wielu właściwości różnych typów. Każdy element jest skojarzony z własną Cell
pochodną do wyświetlania właściwości lub udostępniania interfejsu użytkownika.
Właściwości i hierarchie
TableView
definiuje tylko cztery właściwości:
Intent
typuTableIntent
, wyliczenieRoot
typuTableRoot
, właściwość zawartościTableView
RowHeight
typuint
HasUnevenRows
typubool
Wyliczenie TableIntent
wskazuje, jak zamierzasz używać elementu TableView
:
Te elementy członkowskie sugerują również niektóre zastosowania dla elementu TableView
.
Kilka innych klas jest zaangażowanych w definiowanie tabeli:
TableSectionBase
jest abstrakcyjną klasą, która pochodzi zBindableObject
i definiujeTitle
właściwośćTableSectionBase<T>
jest abstrakcyjną klasą, która pochodzi zTableSectionBase
i implementujeIList<T>
iINotifyCollectionChanged
TableSection
pochodzi zTableSectionBase<Cell>
TableRoot
pochodzi zTableSectionBase<TableSection>
Krótko mówiąc, TableView
ma Root
właściwość ustawioną TableRoot
na obiekt, który jest kolekcją obiektów, z których każda jest kolekcją TableSection
Cell
obiektów. Tabela zawiera wiele sekcji, a każda sekcja zawiera wiele komórek. Sama tabela może mieć tytuł, a każda sekcja może mieć tytuł. Mimo że TableView
korzysta z pochodnych Cell
, nie wykorzystuje DataTemplate
metody .
Forma prozaiczna
Przykład EntryForm definiuje PersonalInformation
model widoku, którego wystąpienie staje się elementem BindingContext
TableView
. Każda pochodna Cell
w tej TableSection
klasie może mieć powiązania z właściwościami PersonalInformation
klasy.
Komórki niestandardowe
Przykład ConditionalCells rozszerza element EntryForm. Klasa ProgrammerInformation
zawiera właściwość logiczną, która zarządza zastosowaniem dwóch dodatkowych właściwości. W przypadku tych dwóch dodatkowych właściwości program używa niestandardowego PickerCell
obiektu na podstawie biblioteki PickerCell.xaml i PickerCell.xaml.cs w Xamarin.Formsbibliotece Book.Toolkit.
IsEnabled
Mimo że właściwości dwóch PickerCell
elementów są powiązane z właściwością logiczną w programie ProgrammerInformation
, ta technika nie wydaje się działać, co powoduje wyświetlenie monitu o następną próbkę.
Sekcje warunkowe
Przykład ConditionalSection umieszcza dwa elementy, które są zależne od wyboru elementu logicznego w osobnym TableSection
elemencie . Plik związany z kodem usuwa tę sekcję z TableView
obiektu lub dodaje ją z powrotem na podstawie właściwości logicznej.
Menu TableView
Innym zastosowaniem elementu TableView
jest menu. Przykład MenuPolecenia demonstruje menu, które pozwala nieco BoxView
poruszać się po ekranie.