Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

데이터 바인딩 - .NET SDK

이 페이지의 내용

  • 데이터 바인딩 예제
  • 단일 Realm 객체에 바인딩
  • Realm collection에 바인딩
  • 데이터 바인딩 및 MVVM

Xamarin, MAUI, 아발로니아 UI 및 기타 MVVM 기반 프레임워크로 빌드된 .NET 애플리케이션에서는 데이터 바인딩을 사용하면 기본 객체나 컬렉션이 변경될 때 UI를 업데이트할 수 있으며, 그 반대의 경우도 마찬가지입니다.

Realm 객체와 컬렉션은 라이브 상태이며 데이터 변경 사항을 반영하도록 자동으로 업데이트 됩니다. 이는 Realm 객체가 INotifyPropertyChanged 를 구현 하기 때문입니다. 및 Realm 컬렉션 이 INotifyCollectionChanged 를 구현. . 라이브 컬렉션과 객체를 UI 에 바인딩하면 UI 와 라이브 객체 및 컬렉션이 동시에 업데이트 됩니다.

참고

컴파일된 바인딩

다음 코드 스니펫은 세 가지 일반적인 데이터 바인딩 사용 사례에 대한 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() 를 호출해서는 안 됩니다. 이렇게 하면 메모리에서 collection을 강제로 로드하여 결과 collection이 더 이상 라이브 객체가 아닙니다.

다음 예에서는 Employee 유형의 퍼블릭 속성을 만듭니다. 클래스의 다른 곳에서는 'EmployeeId'가 '123'인 Employee 에 대한 영역을 쿼리합니다.

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

XAML에서 직원의 Name 속성을 Label 컨트롤의 Text 속성에 바인딩합니다.

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

바인딩할 수 있는 collection에는 두 가지 유형이 있습니다. 먼저, 우리는 Realm 객체의 collection에 바인딩할 수 있습니다. 이 코드 예제에서는 Employee Realm 객체의 공개 IEnumerable 를 만든 다음 직원 collection의 모든 객체로 해당 collection을 채웁니다.

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 객체의 collection 속성 에 바인딩할 수도 있습니다. 이 예에서는 특정 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 앱을 빌드하는 경우 패턴에 따라 View와 ViewModel 간에 양방향으로 적절한 데이터 바인딩이 필요한 경우가 많습니다. 즉, UI에서 속성 값이 변경되면 ViewModel에 알림을 보내야 하며, 그 반대의 경우도 마찬가지입니다. ViewModels는 일반적으로 INotifyPropertyChange 를 구현합니다. 인터페이스를 사용하여 이를 보장합니다.

그러나 UI 요소를 RealmObject 에 바인딩하면 이 알림이 자동으로 발생하므로 ViewModel 코드가 크게 간소화됩니다.

UI 요소를 Realm 라이브 쿼리 에 바인딩할 수도 있습니다. 예를 들어 ListView 를 로 설정하면 쿼리 결과가 변경될 때 목록이 자동으로 INotifyPropertyChange 업데이트됩니다. 인터페이스를 구현할 필요가 없습니다.

예를 들어, 모든 객체를 반환하는 쿼리에 ListView를 바인딩하면, 제품이 영역에서 추가, 변경 또는 제거될 때 사용 가능한 제품 목록이 자동으로 업데이트됩니다.

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

돌아가기

객체 모델 변경