Docs 菜单

Docs 主页开发应用程序Atlas Device SDKs

数据绑定 - .NET SDK

在此页面上

  • 数据绑定示例
  • 绑定到单个 Realm 对象
  • 绑定到 Realm 集合
  • 数据绑定和 MVVM

在使用 Xamarin、Maui、Avalonia 用户界面和其他基于 MVVM 的框架构建的 .NET 应用程序中,当底层对象或集合发生更改时,数据绑定可以实现用户界面更新,反之亦然。

Realm 对象和集合是 实时 的,会自动更新以反映数据更改。这是因为 Realm 对象实现 了 INotifyPropertyChanged 和 Realm 集合实现 INotifyCollectionChanged 。将活动集合和对象绑定到用户界面时,用户界面以及活动对象和集合会同时更新。

注意

已编译的绑定

Realm SDK 不支持 编译绑定。

以下代码片段显示了三个典型数据绑定使用案例的 C# 和 XAML。 它们都使用以下 Realm 对象:

public partial class Employee : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[MapTo("employee_id")]
public string EmployeeId { get; set; }
[MapTo("name")]
public string Name { get; set; }
[MapTo("items")]
public IList<Item> Items { get; }
}
public partial class Item : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[MapTo("owner_id")]
public string OwnerId { get; set; }
[MapTo("summary")]
public string Summary { get; set; }
[MapTo("isComplete")]
public bool IsComplete { get; set; }
}

注意

避免使用 ToList()

由于 Realm collection 是实时的,因此在获取 Realm 对象 collection 时,不应调用 ToList() 。这样做会强制从内存加载集合,因此生成的集合不再是活动对象。

在以下示例中,我们创建了一个类型为Employee的公共属性。 在类的其他位置,我们在 域 中查询“EmployeeId”为“123”的Employee

public Employee Employee123 { get; }
...
Employee123 = realm.All<Employee>()
.FirstOrDefault(e => e.EmployeeId == "123");

在 XAML 中,我们将 Employee 的Name属性绑定到Label控件的Text属性:

<Label Text="{Binding Employee123.Name}"/>

我们可以绑定两种类型的collection。首先,我们可以绑定到 Realm 对象的 collection。在此代码示例中,我们创建Employee Realm 对象的公共IEnumerable ,然后使用Employees 集合中的所有对象填充该集合:

public IEnumerable<Employee> Employees { get; }
...
Employees = realm.All<Employee>();

在关联的 XAML 文件中,我们将ListView绑定到员工IEnumerable以显示所有员工的列表。 在本例中,我们列出每位员工的“EmployeeId”值:

<ListView x:Name="listAllEmployees" ItemsSource="{Binding Employees}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding EmployeeId}"/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

我们还可以绑定到 Realm 对象的collection 属性。在此示例中,我们绑定到特定EmployeeItems属性。 Employee类上的Items属性的类型为IList<Item>

public Employee Employee123 { get; }
...
IncompleteItems = Employee123.Items
.AsRealmQueryable()
.Where(i => i.IsComplete == false);

注意

请注意,我们正在调用AsRealmQueryable()方法。这是必需的,因为我们正在筛选集合。如果要列出Items集合中的所有项目,则无需调用AsRealmQueryable()

XAML 实现与上面的示例类似:

<ListView x:Name="listIncompleteItems" ItemsSource="{Binding IncompleteItems}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Summary}"/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

使用 MVVM 构建 .NET 应用时 模式,您通常希望在 View 和 ViewModel 之间 进行双向 正确的数据绑定:如果 UI 中的属性值发生更改,则应通知 ViewModel,反之亦然。 ViewModel 通常会实现 INotifyPropertyChange 接口以确保这一点。

但是,当您将用户界面元素绑定到RealmObject时,此通知会自动发生,从而大大简化了 ViewModel 代码。

您还可以将用户界面元素绑定到 Realm 实时查询 。例如,如果您绑定 ListView 为实时查询,则当查询结果发生变化时,列表将自动更新;您不需要实现INotifyPropertyChange 接口。

例如,如果将 ListView 绑定到返回所有 Product 对象的查询,则当在 Realm 中添加、更改或删除产品时,可用产品列表会自动更新:

// Somewhere in your ViewModel
AllProducts = realm.All<Products>();
<!-- Somewhere in your View -->
<ListView ItemsSource="{Binding AllProducts}">
← 更改对象模型 - .NET SDK