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

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在組織和安排信息方面更方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章