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 在基础列表中添加、删除和更改项时自动更新,则需要使用一个 ObservableCollection
。 ObservableCollection
在定义中 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 ListView
ItemsSource
, 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
是字符串列表, SomeLabel
其 Text
属性将绑定到该 SelectedItem
字符串。
双向绑定 (示例)