共用方式為


在清單中顯示客戶

顯示和操作 UI 中的實際資料,對於許多應用程式的功能來說是很重要的。 本文將示範您必須執行什麼作業來在清單中顯示 Customer 物件的集合。

這不是教學課程。 如果您需要參考教學課程,請參閱我們的資料繫結教學課程,其能為您提供逐步引導體驗。

作為開始,我們將快速討論資料繫結,包含其內容和運作方式。 然後我們會將 List View 新增至 UI,新增資料繫結,然後使用額外功能自訂該資料繫結。

您需要知道哪些事項?

資料繫結是在應用程式的 UI 中顯示其資料的方式。 這可在您的應用程式中實現不同考量的分離,以讓您的 UI 與其他程式碼區分開來。 這會建立較為清楚的概念模型,以讓您可更輕鬆地讀取和維護它。

每個資料繫結都有兩個部分:

  • 提供要繫結之資料的來源。
  • 在 UI 中會顯示該資料的目標。

若要實作資料繫結,您需要將程式碼新增至為繫結提供資料的來源。 您也將需要將兩個標記延伸的其中一個新增至 XAML,以指定資料來源屬性。 以下是這兩個功能之間的主要差異:

  • x:Bind 是強型別,其會在編譯時間產生程式碼以提供更好的效能。 x:Bind 預設為一次性繫結,其適用於快速顯示不會變更的唯讀資料。
  • Binding 是弱型別,並會在執行階段組合。 這會導致比 x:Bind 較差的效能。 在大部分情況中,您應該使用 x:Bind 而不是 Binding。 不過,您很可能會在較舊的程式碼中遇到 Binding。 Binding 預設為單向資料傳輸,其適用於可在來源變更的唯讀資料。

建議您盡量使用 x:Bind,而我們會在本文中的程式碼片段中示範它。 如需有關其差異的詳細資訊,請參閱 {x:Bind} 和 {Binding} 功能比較

建立資料來源

首先,您需要類別來代表您的客戶資料。 為了提供您參考點,我們將會在這個基礎範例中示範此程序:

public class Customer
{
    public string Name { get; set; }
}

建立清單

在可以顯示任何客戶之前,您需要先建立清單來保存他們。 List View 是基本的 XAML 控制項,其很適用於這個工作。 您的 ListView 目前在頁面上需要一個位置,且很快就需要適用於其 ItemSource 屬性的值。

<ListView ItemsSource=""
    HorizontalAlignment="Center"
    VerticalAlignment="Center"/>

當您將資料繫結至您的 ListView 之後,建議您返回文件並嘗試自訂其外觀和版面配置以符合您的需求。

將資料繫結至您的清單

您已經製作出基本的 UI 來保存您的繫結,現在您需要設定來源來提供它們。 以下範例會示範如何達成此目標:

public sealed partial class MainPage : Page
{
    public ObservableCollection<Customer> Customers { get; }
        = new ObservableCollection<Customer>();

    public MainPage()
    {
        this.InitializeComponent();
          // Add some customers
        this.Customers.Add(new Customer() { Name = "NAME1"});
        this.Customers.Add(new Customer() { Name = "NAME2"});
        this.Customers.Add(new Customer() { Name = "NAME3"});
    }
}
<ListView ItemsSource="{x:Bind Customers}"
    HorizontalAlignment="Center"
    VerticalAlignment="Center">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="local:Customer">
            <TextBlock Text="{x:Bind Name}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

資料繫結概觀在其有關繫結至項目集合的小節中,會引導您處理類似的問題。 我們的範例會示範下列重要步驟:

  • 在 UI 的程式碼後置中,建立 ObservableCollection<T> 類型的屬性來保存您的 Customer 物件。
  • 將 ListView 的 ItemSource 繫結至該屬性。
  • 為 ListView 提供基本的 ItemTemplate,其將會設定每個項目在清單中的顯示方式。

如果您想要自訂版面配置、新增項目選取,或是調整您剛建立的 DataTemplate,您可以回頭查看 ListView 文件。 如果您想要編輯客戶,該怎麼辦?

透過 UI 編輯客戶

您已在清單中顯示客戶,但資料繫結可讓您達成更多工作。 您甚至可以直接從 UI 編輯您的資料。 若要這樣做,我們先來討論資料繫結的三個模式:

  • 一次性:此資料繫結只會啟用一次,且不會對變更做出反應。
  • 單向:此資料繫結會以對資料來源所做的任何變更來更新 UI。
  • 雙向:此資料繫結會以對資料來源所做的任何變更來更新 UI,也會以在 UI 內所做的任何變更來更新資料。

如果您已按照先前的程式碼片段執行,您所做的繫結會使用 x:Bind 且不指定模式,這使它成為「單次」繫結。 如果您想要直接從 UI 編輯您的客戶,您需要將它變更為「雙向」繫結,來使資料的變更會傳送回 Customer 物件。 深入了解資料繫結中會提供詳細資訊。

若資料來源已變更,雙向繫結也會更新 UI。 若樣讓此能夠運作,您必須在來源上實作 INotifyPropertyChanged \(部分機器翻譯\),並確定其屬性 setter 會引發 PropertyChanged 事件。 常見的作法是讓它們呼叫 OnPropertyChanged 方法之類的協助程式方法,如下所示:

public class Customer : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get => _name;
        set
        {
            if (_name != value)
                {
                    _name = value;
                    this.OnPropertyChanged();
                }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

然後,使用 TextBox 而不是 TextBlock,來使 ListView 中的文字可編輯,並確定已將資料繫結上的 Mode 設定為 TwoWay

<ListView ItemsSource="{x:Bind Customers}"
    HorizontalAlignment="Center"
    VerticalAlignment="Center">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="local:Customer">
            <TextBox Text="{x:Bind Name, Mode=TwoWay}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

快速確認是否能正確運作的方法,是新增含有 TextBox 控制項及 OneWay 繫結的第二個 ListView。 當您編輯第一個清單時,系統將會自動變更第二個清單中的值。

注意

直接在 ListView 內編輯是確認雙向繫結能成功運作的簡單方式,但這可能會導致可用性的複雜化。 如果您想進一步擴充應用程式的功能,請考慮使用其他 XAML 控制項來編輯資料,並將 ListView 保留為僅顯示。

更進一步

您已經建立具有雙向繫結的客戶清單,歡迎返回我們先前為您提供的文件連結,並進一步實驗。 如果您想要基本和進階繫結的逐步解說,也可以查看我們的資料繫結教學課程;您也可以研究清單/詳細資訊模式之類的控制項,以開發出更為強大的 UI。

實用的 API 和文件

以下是 API 的快速摘要及其他實用的文件,以協助您開始使用資料繫結。

實用的 API

API 描述
DataTemplate \(英文\) 描述資料物件的視覺化結構,以允許在 UI 中顯示特定元素。
x:Bind 關於建議的 x:Bind 標記延伸的文件。
繫結 關於較舊的 Binding 標記延伸的文件。
ListView 以垂直堆疊顯示資料項目的 UI 控制項。
TextBox 用來在 UI 中顯示可編輯文字資料的基本文字控制項。
INotifyPropertyChanged \(英文\) 使資料變成可觀察,並將其提供至資料繫結的介面。
ItemsControl 此類別的 ItemsSource 屬性能允許 ListView 繫結至資料來源。

實用的文件

主題 說明
深入了解資料繫結 資料繫結原則的基本概觀
資料繫結概觀 有關資料繫結的詳細概念性資訊。
清單檢視 建立和設定 ListView 的相關資訊,包括 DataTemplate 的實作

實用的程式碼範例

程式碼範例 描述
資料繫結教學課程 資料繫結基本概念的逐步引導體驗。
ListView 和 GridView \(英文\) 透過資料繫結探索更詳細的 ListView。
QuizGame \(英文\) 查看資料繫結的運作方式,包括適用於 INotifyPropertyChanged 之標準實作的 BindableBase 類別 (位於 Common 資料夾中)。