第十九章:集合檢視(十七)

wangccsy發表於2018-11-07

TableView及其意圖

Xamarin.Forms中三個集合檢視中的第三個是TableView,名稱可能有點欺騙性。當我們在程式設計上下文中聽到“表”這個詞時,我們通常會想到一個二維網格,例如HTML表。 Xamarin.Forms TableView是一個垂直的,可滾動的專案列表,它們是從Cell類視覺化生成的。這可能聽起來與ListView非常相似,但ListView和TableView在使用上有很大不同:
ListView通常顯示相同型別的項列表,通常是特定資料類的例項。這些專案位於IEnumerable集合中。 ListView指定用於渲染這些資料物件的單個Cell派生。物品是可選擇的。
TableView顯示不同型別的專案列表。在現實生活中,這些項通常是單個類的屬性。每個專案都與其自己的Cell關聯以顯示屬性,並且通常允許使用者與屬性進行互動。在一般情況下,TableView顯示多種型別的單元格。
屬性和層次結構
ListView和ItemsView一起定義了18個屬性,而TableView只有四個:

  • 型別為TableIntent的Intent。
  • TableRoot型別的根。 (這是TableView的content屬性。)
  • Type型別的RowHeight。
  • HowUnevenRows型別為bool。

RowHeight和HasUnevenRows屬性在TableView中扮演與ListView中相同的角色。
也許TableView類最具啟發性的屬性是一個不保證對功能和外觀有任何影響的屬性。 此屬性名為Intent,它指示您如何在程式中使用特定的TableView。 您可以將此屬性(或不是)設定為TableIntent列舉的成員:

  • Data
  • Form
  • Settings
  • Menu

這些成員建議您使用TableView的各種方法。 當用於資料時,TableView通常顯示相關專案,但不同型別的專案。 表單是使用者與之互動以輸入資訊的一系列專案。 用於程式設定的TableView有時稱為對話方塊。 此用法類似於Form,但設定通常具有預設值。 您還可以將TableView用於選單,在這種情況下,專案通常使用文字或點陣圖顯示,並在點選時啟動操作。
Root屬性定義TableView顯示的專案層次結構的根。 TableView中的每個專案都與單個Cell派生相關聯,並且各個單元格可以組織成多個部分。 為了支援這種專案層次結構,定義了幾個類:

  • TableSectionBase是一個派生自BindableObject的抽象類,它定義了Title屬性。
  • TableSectionBase是一個抽象類,它派生自TableSectionBase並實現IList 介面,因此也實現ICollection 和IEnumerable 介面。 該類還實現了INotifyCollectionChanged介面; 在內部,它為此集合維護一個ObservableCollection 。 這允許專案動態新增到TableView或從TableView中刪除。
  • TableSection派生自TableSectionBase 。
  • PableRoot派生自TableSectionBase 。

總之,TableView有一個Root屬性,您可以將其設定為TableRoot物件,該物件是TableSection物件的集合,每個物件都是Cell物件的集合。
請注意,TableSection和TableRoot都從TableSectionBase繼承Title屬性。 根據派生類,這可以是節的標題,也可以是整個表的標題。 TableSection和TableRoot都有建構函式,可以在建立物件時設定此Title屬性。
TableSectionBase 類定義了兩個Add方法,用於向集合中新增項。 ICollection介面需要第一個Add方法; 第二個不是:

  • public void Add(T item)
  • public void Add(IEnumerable items)

第二個Add方法似乎允許您將一個TableSection新增到另一個TableSection,並將一個TableRoot新增到另一個TableRoot,並且該過程似乎暗示您可以擁有一組巢狀的TableRoot或TableSection例項。但事實並非如此。此Add方法只是將專案從一個集合傳輸到另一個集合。層次結構永遠不會比TableRoot更深入,TableRoot是TableSection物件的集合,TableSection物件是Cell物件的集合。
雖然TableView使用Cell物件,但它不使用DataTemplate。無論是在程式碼中還是在XAML中定義TableView,都始終直接在Cell物件上設定資料繫結。通常,這些繫結非常簡單,因為您在TableView上設定了由各個項繼承的BindingContext。
在視覺和功能上,TableView與ScrollView中的StackLayout沒有太大區別,其中StackLayout包含帶有繫結的短視覺樹的集合。但通常TableView在組織和安排資訊方面更方便。


相關文章