Vinculação de dados - .NET SDK
Nesta página
Em aplicativos .NET criados com Xamarin, MAUI, Avalonia UI e outras estruturas baseadas em MVVM, a vinculação de dados permite atualizações da UI quando um objeto ou collection subjacente é alterado e vice-versa.
Realm de domínio e coleções estão ativos e são atualizados automaticamente para refletir as alterações de dados. Isso ocorre porque os objetos de Realm implementam INotifyPropertyChanged e as collections do Realm implementam INotifyCollectionChanged. Quando você vincula coleções e objetos ativos à interface do usuário, a UI e os objetos ativos e as coleções são atualizados ao mesmo tempo.
Exemplos de vinculação de dados
Os seguintes trechos de código mostram C# e XAML para três casos de uso típicos de vinculação de dados. Todos eles usam os seguintes Objeto de 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; } }
Observação
Evite usar ToList()
Como a collection do Realm está ativa, você não deve chamar ToList()
ao obter uma collection de objeto de Realm. Isso força o carregamento da coleção da memória, de modo que a coleção resultante não seja mais um objeto ativo.
Vinculação a um único Objeto de Realm
No exemplo a seguir, criamos uma propriedade pública do tipo Employee
. Em outro lugar em nossa classe, fazemos uma query no nosso Realm para Employee
com um "EmployeeId" de "123":
public Employee Employee123 { get; } ... Employee123 = realm.All<Employee>() .FirstOrDefault(e => e.EmployeeId == "123");
Em nosso XAML, vinculamos a propriedade Name
do funcionário à propriedade Label
de um controle Text
:
<Label Text="{Binding Employee123.Name}"/>
Vinculação a uma Realm collection
Existem dois tipos de coleções aos quais podemos vincular. Primeiro, podemos vincular a uma coleção de objetos de Realm. Neste exemplo de código, criamos um IEnumerable
público do objeto de Realm Employee
e, em seguida, preenchemos essa coleção com todos os objetos da coleção Empregados:
public IEnumerable<Employee> Employees { get; } ... Employees = realm.All<Employee>();
No arquivo XAML associado, vinculamos um ListView
aos funcionários IEnumerable
para mostrar uma lista de todos os funcionários. Nesse caso, estamos listando o valor "EmployeeId" de cada funcionário:
<ListView x:Name="listAllEmployees" ItemsSource="{Binding Employees}"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Label Text="{Binding EmployeeId}"/> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView>
Também podemos vincular a uma propriedade de collection de um Objeto de Realm. Neste exemplo, nos ligamos à propriedade Items
de um Employee
específico. A propriedade Items
na classe Employee
é do tipo IList<Item>
.
public Employee Employee123 { get; } ... IncompleteItems = Employee123.Items .AsRealmQueryable() .Where(i => i.IsComplete == false);
Observação
Observe que estamos chamando o método AsRealmQueryable() . Isso é necessário porque estamos filtrando a collection. Se quisermos listar todos os Itens na coleção Items
, não precisamos chamar AsRealmQueryable()
.
A implementação do XAML é semelhante ao exemplo acima:
<ListView x:Name="listIncompleteItems" ItemsSource="{Binding IncompleteItems}"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Label Text="{Binding Summary}"/> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView>
Vinculação de dados e MVVM
Ao criar um aplicativo .NET usando o MVVM , você geralmente deseja a vinculação de dados adequada em ambas as direções entre a Visualização e o ViewModel: se um valor de propriedade for alterado na UI, o ViewModel deverá ser notificado e vice-versa. Os ViewModels normalmente implementam a INotifyPropertyChange interface para garantir isso.
No entanto, quando você vincula elementos da interface do usuário a um RealmObject, essa notificação acontece automaticamente, simplificando muito o código do ViewModel.
Você também pode vincular um elemento da interface do usuário a uma query ao vivo de realm . Por exemplo, se você vincular um ListView a uma query ativa, a lista será atualizada automaticamente quando os resultados da query forem alterados; você não precisa implementar a INotifyPropertyChange
interface .
Por exemplo, se você vincular um ListView a uma query que retorna todos os objetos Product, a lista de produtos disponíveis será atualizada automaticamente quando um produto for adicionado, alterado ou removido do realm:
// Somewhere in your ViewModel AllProducts = realm.All<Products>();
<!-- Somewhere in your View --> <ListView ItemsSource="{Binding AllProducts}">