.NETXamarinMaui、 、 Avalonic UI 、およびその他の MVVM ベースのフレームワークを使用して構築された アプリケーションでは、基礎となるオブジェクトまたはコレクションが変更されたときに、データバインディングによって UI の更新が可能になり、その逆も同様です。
Realm のオブジェクトとコレクションはライブであり、データの変更を反映するように自動的に更新されます。これは、 Realmオブジェクトが INotifyPropertyChecked を実装し、 Realmコレクションが INotifyCollectionchanged を実装するためです。ライブ コレクションとオブジェクトをUIにバインドすると、 UIとライブ オブジェクトとコレクションの両方が同時に更新されます。
データバインディングの例
次のコード スニペットは、3 つの一般的なデータ バインディング ユースケースの 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 コレクションはライブのため、Realm オブジェクトのコレクションを取得するときに ToList()を呼び出しないでください。 そうすると、メモリからコレクションが強制的に読み込まれるため、結果として得られるコレクションはライブ オブジェクトではなくなります。
単一の Realm オブジェクトへのバインディング
次の例では、 Employee型のパブリック プロパティを作成しています。 クラスの他の場所で、"EmployeeId" が "123" を持つEmployeeのRealmをクエリします。
public Employee Employee123 { get; } ... Employee123 = realm.All<Employee>() .FirstOrDefault(e => e.EmployeeId == "123");
XAML では、従業員のNameプロパティをLabelコントロールのTextプロパティにバインドします。
<Label Text="{Binding Employee123.Name}"/>
Realm コレクションへのバインディング
バインドできるコレクションは 2 種類あります。 まず、Realm オブジェクトのコレクションにバインドできます。 このコード例では、 Employee Realm オブジェクトのパブリックIEnumerableを作成し、そのコレクションに 従業員 コレクション内のすべてのオブジェクトを入力します。
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 オブジェクトのコレクション プロパティにバインドすることもできます。 この例では、特定の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>
データバインディングと MV VM
MVVM パターンを使用して.NETアプリを構築する場合、ビューと ViewModel 間の両方の方向に適切なデータ バインディングが必要なことがよくあります。UIでプロパティ値が変更された場合は、ViewModel に通知が必要で、その逆も同様です。ViewModel は通常、これを保証するためにINotifyPropertyCheckインターフェースを実装します。
ただし、UI 要素をRealmObjectにバインドすると、この通知は自動的に行われるため、ViewModel コードが大幅に簡素化されます。
また、UI要素を邦土ライブ クエリにバインドすることもできます。例、ListView をライブ クエリにバインドすると、クエリの結果が変更されたときにリストは自動的に更新されます。 INotifyPropertyChange インターフェースを実装する必要はありません。
たとえば、すべての 製品 オブジェクトを返すクエリに ListView をバインドすると、使用可能な製品のリストは、製品が Realm から追加、変更、または削除されると自動的に更新されます。
// Somewhere in your ViewModel AllProducts = realm.All<Products>();
<!-- Somewhere in your View --> <ListView ItemsSource="{Binding AllProducts}">