這個用舉例的比較好說,假定我有一個 Car 集合,裡面有各式各樣的車種,要用一個 ListView 把車種名稱顯示出來,最簡單就是去定義一組 DataTemplate 裡面有一個 Label 把 Car 的 Name 綁定上去就可以了,但是保時捷說我們的名稱要用 Button 來呈現,哦~好~客戶最大,客戶說了算,那要怎麼弄?
DataTemplateSelector
資料是同一組,但是裡面就是有一些特殊的資料,必須用特殊的 UI 來呈現,怎麼辦? 這個時候我們就要動用一個東西叫 DataTemplateSelector
,ListView 的 ItemTemplate 屬性除了指定 DataTemplate 之外,還可以指定 DataTemplateSelector,而 DataTemplateSelector 可以讓我們去指定一組在何種條件之下要使用哪個 DataTemplate 的邏輯,底下我們產生一個 CarDataTemplateSelector
。
public class CarDataTemplateSelector : DataTemplateSelector
{
private static readonly DataTemplate ToyotaViewCellDataTemplate = new DataTemplate(typeof(ToyotaViewCell));
private static readonly DataTemplate PorscheViewCellDataTemplate = new DataTemplate(typeof(PorscheViewCell));
protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
if (item is Toyota) return ToyotaViewCellDataTemplate;
if (item is Porsche) return PorscheViewCellDataTemplate;
if (((Car)item).Name.Equals("Porsche")) return PorscheViewCellDataTemplate;
return null;
}
}
可以看到在 OnSelectTemplate
方法中,就可以撰寫我們指定的 DataTemplate 回傳邏輯,保時捷的名稱就使用 PorscheViewCellDataTemplate 來呈現。
把 DataTemplate 獨立成一個 Xaml 檔
如果我們有去看 Xamarin 官網 Creating a DataTemplate 這篇文章的話,它都是把 DataTemplate 宣告在自個兒的 Page 裡面,而我這邊選擇把這些 DataTemplate 切出去讓它們各自獨立成一個 Xaml 檔,至於切出去之後如何使用? 也很簡單,只要在定義 DataTemplate Resource 的標籤底下指定它們的類別名稱就可以了。
參考資料
< Source Code >