Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

データバインディング - .NET SDK

項目一覧

  • データバインディングの例
  • 単一の Realm オブジェクトへのバインディング
  • Realm コレクションへのバインディング
  • データバインディングと MV VM

.NETXamarinMaui、 、 Avalonic UI 、およびその他の MVVM ベースのフレームワークを使用して構築された アプリケーションでは、基礎となるオブジェクトまたはコレクションが変更されたときに、データバインディングによって UI の更新が可能になり、その逆も同様です。

Realm のオブジェクトとコレクションはライブであり、データの変更を反映するように自動的に更新されます。 これは、Realm オブジェクトが INotifyPropertyChecked を実装しているためです。 および Realm コレクションは INotifyCollectionchanged を実装します 。ライブ コレクションとライブ オブジェクトを UI にバインドすると、UI とライブ オブジェクトとコレクションの両方が同時に更新されます。

注意

コンパイルされたバインディング

次のコード スニペットは、3 つの一般的なデータ バインディング ユースケースの C# と XAML の両方を示しています。 ドライバーはすべて、次の 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; }
}

注意

ToList() の使用を避ける

Realm コレクションはライブのため、Realm オブジェクトのコレクションを取得するときに ToList()を呼び出しないでください。 そうすると、メモリからコレクションが強制的に読み込まれるため、結果として得られるコレクションはライブ オブジェクトではなくなります。

次の例では、 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}"/>

バインドできるコレクションは 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 オブジェクトのコレクション プロパティにバインドすることもできます。 この例では、特定のEmployeeItemsプロパティにバインドします。 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 を使用して .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}">

戻る

オブジェクトモデルの変更