数据绑定 - .NET SDK
在使用 Xamarin、Maui、Avalonia 用户界面和其他基于 MVVM 的框架构建的 .NET 应用程序中,当底层对象或集合发生更改时,数据绑定可以实现用户界面更新,反之亦然。
Realm对象和集合是 实时 的,会自动更新以反映数据更改。这是因为Realm对象实现了 INotifyPropertyChanged 和Realm集合实现 INotifyCollectionChanged 。将活动集合和对象绑定到用户界面时,用户界面以及活动对象和集合会同时更新。
数据绑定示例
以下代码片段显示了三个典型数据绑定使用案例的 C# 和 XAML。 它们都使用以下 Realm 对象:
public partial class Employee : IRealmObject { [ ] [ ] public ObjectId Id { get; set; } = ObjectId.GenerateNewId(); [ ] public string EmployeeId { get; set; } [ ] public string Name { get; set; } [ ] public IList<Item> Items { get; } } public partial class Item : IRealmObject { [ ] [ ] public ObjectId Id { get; set; } = ObjectId.GenerateNewId(); [ ] public string OwnerId { get; set; } [ ] public string Summary { get; set; } [ ] public bool IsComplete { get; set; } }
注意
避免使用 ToList()
由于 Realm collection 是实时的,因此在获取 Realm 对象 collection 时,不应调用 ToList()
。这样做会强制从内存加载集合,因此生成的集合不再是活动对象。
绑定到单个 Realm 对象
在以下示例中,我们创建了一个类型为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}"/>
绑定到 Realm 集合
我们可以绑定两种类型的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 属性。在此示例中,我们绑定到特定Employee
的Items
属性。 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
使用 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}">