在 UI 中显示和操作真实数据对于许多应用程序的功能至关重要。 本文将向你介绍需要了解的内容,以便在列表中显示客户对象集合。
这不是教程。 如果需要,请参阅 我们的数据绑定教程,该教程将提供分步引导式体验。
我们将首先快速讨论数据绑定,即什么是数据绑定以及它如何工作。 然后,我们将向 UI 添加 ListView ,添加数据绑定,并使用其他功能自定义数据绑定。
需要了解哪些信息?
数据绑定是在其 UI 中显示应用数据的一种方法。 这样就可以在应用中
每个数据绑定都有两个部分:
- 提供要绑定的数据的源。
- 显示数据的 UI 中的目标。
若要实现数据绑定,需要向源添加代码,以便向绑定提供数据。 还需要向 XAML 添加两个标记扩展之一来指定数据源属性。 下面是两者之间的主要区别:
- x:Bind 是强类型化的,并在编译时生成代码以提高性能。 x:Bind 默认为一次性绑定,这种绑定针对只读且不更改的数据的快速显示进行了优化。
- 绑定 在运行时处于弱类型化和组装状态。 这会导致性能低于使用 x:Bind 时。 几乎所有情况下,都应使用 x:Bind 而不是 Binding。 但是,你可能在较旧的代码中遇到它。 绑定默认为单向数据传输,这对来源可变的只读数据进行了优化。
建议尽可能使用 x:Bind ,本文中的代码片段中会显示它。 有关差异的详细信息,请参阅 {x:Bind} 和 {Binding} 功能比较。
创建数据源
首先,需要一个类来表示客户数据。 为了给您提供参考点,我们将在这个简单示例中演示该过程。
public class Customer
{
public string Name { get; set; }
}
创建列表
在显示任何客户之前,需要创建列表来保存这些客户。 列表视图是一个基本 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 ,用于配置列表中每个项的显示方式。
如果您想自定义布局、添加项目选择或调整刚创建的数据模板 ,可以随时查看 列表视图 文档。 但是,如果要编辑客户,该怎么办?
通过 UI 编辑客户
你已在列表中显示客户,但数据绑定让你实现更多功能。 如果可以直接从 UI 编辑数据,该怎么办? 为此,让我们首先讨论三种数据绑定模式:
- 一次性:此数据绑定仅激活一次,并且不会对更改做出反应。
- 单向:此数据绑定将使用数据源中的任何更改更新用户界面 (UI)。
- 双向:此数据绑定会随时同步更新 UI 和数据源,既可以根据数据源的任何更改更新 UI,也可以根据 UI 中的更改更新数据。
如果遵循了前面所述的代码片段,则创建的绑定使用 x:Bind,并且未指定模式,使其成为 One-Time 绑定。 如果想直接从 UI 界面编辑客户,则需要将其更改为 Two-Way 绑定,以便将数据中的更改传回到客户对象。 深入的数据绑定 有更多信息。
如果数据源已更改,双向绑定也会更新 UI。 为此,必须在源上实现 INotifyPropertyChanged,并确保其属性设置器引发 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 中的文本,并确保将数据绑定上的 模式 设置为 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 内编辑是一种简单的方式来显示 Two-Way 绑定的操作,但可能导致可用性复杂化。 若要进一步提升您的应用,请考虑使用 其他 XAML 控件 来编辑数据,并让您的 ListView 仅用于显示。
更进一步
现在您已经创建了这份具有双向绑定的客户列表,可以随意返回我们链接到的文档并尽情探索。 您可以查看我们的 数据绑定教程 进行基本绑定和高级绑定的分步演练,或者调查诸如 列表/细节模式 之类的控件,以创建更可靠的 UI。
有用的 API 和文档
下面是 API 和其他有用文档的快速摘要,可帮助你开始使用数据绑定。
有用的 API
API(应用程序编程接口) | DESCRIPTION |
---|---|
数据模板 | 描述数据对象的视觉结构,允许在 UI 中显示特定元素。 |
x:Bind | 有关推荐的 x:Bind 标记扩展的文档。 |
绑定 | 有关旧版绑定标记扩展的文档。 |
列表视图 | 显示垂直堆栈中的数据项的 UI 控件。 |
文本框 | 用于在 UI 中显示可编辑文本数据的基本文本控件。 |
INotifyPropertyChanged | 用于使数据可观测的接口,将其提供给数据绑定。 |
ItemsControl | 此类的 ItemsSource 属性允许 ListView 绑定到数据源。 |
有用的文档
主题 | DESCRIPTION |
---|---|
深入数据绑定 | 数据绑定原则的基本概述 |
数据绑定概述 | 有关数据绑定的详细概念信息。 |
列表视图 | 有关创建和配置 ListView 的信息,包括实现 DataTemplate |
有用的代码示例
代码示例 | DESCRIPTION |
---|---|
数据绑定教程 | 逐步引导式体验,了解数据绑定的基础知识。 |
ListView 和 GridView | 探索具有数据绑定的更复杂的列表视图。 |
QuizGame | 查看数据绑定的实际应用,包括 BindableBase 类(在“Common”文件夹中),以获取 INotifyPropertyChanged的标准实现。 |