データバインディング - .NET SDK
.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 アプリを構築する場合 パターンには、ビューとビューモデル間の 両方の方向に 適切なデータバインディングが必要なことがよくあります。UI でプロパティ値が変更された場合は、ViewModel に通知が必要で、その逆も同様です。ViewModels は通常、 INotifyPropertyCheck を実装します インターフェースを使用して、これを保証します。
ただし、UI 要素をRealmObjectにバインドすると、この通知は自動的に行われるため、ViewModel コードが大幅に簡素化されます。
また、UI 要素を Realmライブ クエリにバインドすることもできます。 For example, if you bind a ListView to a live query, then the list will update automatically when the results of the query change; you do not need to implement the INotifyPropertyChange
interface.
たとえば、すべての 製品 オブジェクトを返すクエリに ListView をバインドすると、使用可能な製品のリストは、製品が Realm から追加、変更、または削除されると自動的に更新されます。
// Somewhere in your ViewModel AllProducts = realm.All<Products>();
<!-- Somewhere in your View --> <ListView ItemsSource="{Binding AllProducts}">