A Xamarin.Forms ListView 用于显示数据列表。 本文介绍如何使用 ListView 数据填充数据以及如何将数据绑定到所选项。

ItemsSource

使用 ItemsSource 属性填充 A ListView ,该属性可以接受任何实现的 IEnumerable 集合。 填充 ListView 涉及使用字符串数组的最简单方法:

<ListView>
      <ListView.ItemsSource>
          <x:Array Type="{x:Type x:String}">
            <x:String>mono</x:String>
            <x:String>monodroid</x:String>
            <x:String>monotouch</x:String>
            <x:String>monorail</x:String>
            <x:String>monodevelop</x:String>
            <x:String>monotone</x:String>
            <x:String>monopoly</x:String>
            <x:String>monomodal</x:String>
            <x:String>mononucleosis</x:String>
          </x:Array>
      </ListView.ItemsSource>
</ListView>

等效 C# 代码如下:

var listView = new ListView();
listView.ItemsSource = new string[]
  "mono",
  "monodroid",
  "monotouch",
  "monorail",
  "monodevelop",
  "monotone",
  "monopoly",
  "monomodal",
  "mononucleosis"

此方法将使用字符串列表填充 ListView 。 默认情况下, ListView 将为每个行调用 ToString 并显示结果 TextCell 。 若要自定义数据显示方式,请参阅 单元格外观

由于 ItemsSource 已发送到数组,因此内容不会随着基础列表或数组更改而更新。 如果希望 ListView 在基础列表中添加、删除和更改项时自动更新,则需要使用一个 ObservableCollectionObservableCollection 在定义中 System.Collections.ObjectModel 并且与它相同 List,只不过它可以通知 ListView 任何更改:

ObservableCollection<Employee> employees = new ObservableCollection<Employee>();
listView.ItemsSource = employees;
//Mr. Mono will be added to the ListView because it uses an ObservableCollection
employees.Add(new Employee(){ DisplayName="Mr. Mono"});

数据绑定是“glue”,用于将用户界面对象的属性绑定到某些 CLR 对象的属性,例如 viewmodel 中的类。 数据绑定非常有用,因为它通过替换大量无聊样板代码来简化用户界面的开发。

数据绑定的工作原理是随着对象绑定值的变化而保持同步。 不必在控件的值发生更改时编写事件处理程序,而是在 viewmodel 中建立绑定并启用绑定。

有关数据绑定的详细信息,请参阅 XAML 基础知识文章系列的第四Xamarin.Forms部分的数据绑定基础知识

绑定单元格

单元格 (和单元格子级的属性) 可以绑定到对象 ItemsSource的属性。 例如,一个 ListView 可用于显示员工列表。

public class Employee
    public string DisplayName {get; set;}

An ObservableCollection<Employee> is created, set as the ListViewItemsSource, and the list is populated with data:

ObservableCollection<Employee> employees = new ObservableCollection<Employee>();
public ObservableCollection<Employee> Employees { get { return employees; }}
public EmployeeListPage()
    EmployeeView.ItemsSource = employees;
    // ObservableCollection allows items to be added after ItemsSource
    // is set and the UI will react to changes
    employees.Add(new Employee{ DisplayName="Rob Finnerty"});
    employees.Add(new Employee{ DisplayName="Bill Wrestler"});
    employees.Add(new Employee{ DisplayName="Dr. Geri-Beth Hooper"});
    employees.Add(new Employee{ DisplayName="Dr. Keith Joyce-Purdy"});
    employees.Add(new Employee{ DisplayName="Sheri Spruce"});
    employees.Add(new Employee{ DisplayName="Burt Indybrick"});

虽然 a ListView 将在响应其基础ObservableCollection更改时进行更新,ListView但如果为原始ObservableCollection引用分配了其他ObservableCollection实例 (,则不会更新该实例,例如 employees = otherObservableCollection;) 。

以下代码片段演示 ListView 了绑定到员工列表:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:constants="clr-namespace:XamarinFormsSample;assembly=XamarinFormsXamlSample"
             x:Class="XamarinFormsXamlSample.Views.EmployeeListPage"
             Title="Employee List">
  <ListView x:Name="EmployeeView"
            ItemsSource="{Binding Employees}">
    <ListView.ItemTemplate>
      <DataTemplate>
        <TextCell Text="{Binding DisplayName}" />
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</ContentPage>

此 XAML 示例定义一个ContentPage包含 .ListView 可通过 ItemsSource 属性设置 ListView 的数据源。 在 ListView.ItemTemplate 元素内定义 ItemsSource 中每一行的布局。 这会导致以下屏幕截图:

ObservableCollection 不是线程安全的。 ObservableCollection修改会导致 UI 更新发生在执行修改的同一线程上。 如果线程不是主 UI 线程,则会导致异常。

绑定 SelectedItem

通常,需要绑定到所选项, ListView而不是使用事件处理程序来响应更改。 若要在 XAML 中执行此操作,请 SelectedItem 绑定属性:

<ListView x:Name="listView"
          SelectedItem="{Binding Source={x:Reference SomeLabel},
          Path=Text}">
</ListView>

假设 listView's ItemsSource 是字符串列表, SomeLabelText 属性将绑定到该 SelectedItem字符串。

  • 双向绑定 (示例)
  •