[料理佳餚] Xamarin.Forms 中不同的 DataItem 如何指定使用不同的 DataTemplate

這個用舉例的比較好說,假定我有一個 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 >

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學