Docs Menu
Docs Home
/ /
Datos del modelo

Enlace de datos - SDK .NET

En aplicaciones .NET compiladas con Xamarin, MAUI, Avalonia UI y otros frameworks basados en MVVM, la vinculación de datos permite actualizar la Interfaz de Usuario cuando un objeto o colección subyacente cambia y viceversa.

Los objetos y colecciones de Realm están activos y se actualizan automáticamente para reflejar los cambios en los datos. Esto se debe a que los objetos de Realm implementan Notificar propiedad modificadaLas colecciones de Realm implementan INotifyCollectionChanged. Al vincular colecciones y objetos activos a la interfaz de usuario (IU), tanto la IU como los objetos y colecciones activos se actualizan simultáneamente.

Nota

Enlaces compilados

El SDK de Realm no admite enlaces compilados.

Los siguientes fragmentos de código muestran C# y XAML para tres casos típicos de enlace de datos. Todos utilizan los siguientes objetos 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; }
}

Nota

Evite usar ToList()

Debido a que las colecciones de Realm están activas, no debes llamar ToList() Al obtener una colección de objetos Realm, se fuerza la carga de la colección desde la memoria, por lo que la colección resultante deja de ser un objeto activo.

En el siguiente ejemplo, creamos una propiedad pública de tipo Employee. En otra parte de nuestra clase, consultamos nuestro dominio para el Employee con un "EmployeeId" de "123":

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

En nuestro XAML, vinculamos la propiedad Name del Empleado a la propiedad Text de un control Label:

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

Hay dos tipos de colecciones a las que podemos enlazar. Primero, podemos enlazar a una colección de objetos Realm. En este ejemplo de código, creamos un IEnumerable público del objeto Realm Employee y luego rellenamos esa colección con todos los objetos de la colección Empleados:

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

En el archivo XAML asociado, vinculamos un ListView a los empleados IEnumerable para mostrar una lista de todos los empleados. En este caso, indicamos el valor "EmployeeId" de cada empleado:

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

También podemos enlazar a una propiedad de colección de un objeto Realm. En este ejemplo, enlazamos a la Items propiedad de un Employee específico. La Items propiedad de la Employee clase es de IList<Item> tipo.

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

Nota

Tenga en cuenta que estamos llamando al método AsRealmQueryable(). Esto es necesario porque estamos filtrando la colección. Si queremos listar todos los elementos de la Items colección, no necesitamos llamar AsRealmQueryable() a.

La implementación de XAML es similar al ejemplo anterior:

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

Al crear una aplicación .NET utilizando el patrón MVVM, a menudo se desea una correcta vinculación de datos en ambas direcciones entre la Vista y el ViewModel: si se cambia el valor de una propiedad en la interfaz de usuario, se debe notificar al ViewModel y viceversa. Los ViewModels suelen implementar la interfaz INotifyPropertyChange para garantizar esto.

Sin embargo, cuando vincula elementos de UI a un RealmObject, esta notificación ocurre automáticamente, lo que simplifica enormemente su código ViewModel.

También puedes vincular un elemento de la interfaz de usuario a una consulta en vivo de un dominio. Por ejemplo, si vinculas una ListView a una consulta en vivo, la lista se actualizará automáticamente cuando cambien los resultados de la consulta; no es necesario implementar la INotifyPropertyChange interfaz.

Por ejemplo, si vincula un ListView a una consulta que devuelve todos los objetos Product, la lista de productos disponibles se actualiza automáticamente cuando se agrega, modifica o elimina un producto del ámbito:

// Somewhere in your ViewModel
AllProducts = realm.All<Products>();
<!-- Somewhere in your View -->
<ListView ItemsSource="{Binding AllProducts}">

Volver

Cambiar un modelo de objeto

En esta página