데이터 바인딩 - .NET SDK
Xamarin, MAUI, 아발로니아 UI 및 기타 MVVM 기반 프레임워크로 빌드된 .NET 애플리케이션에서는 데이터 바인딩을 사용하면 기본 객체나 컬렉션이 변경될 때 UI를 업데이트할 수 있으며, 그 반대의 경우도 마찬가지입니다.
Realm 객체와 컬렉션은 라이브 상태이며 데이터 변경 사항을 반영하도록 자동으로 업데이트 됩니다. 이는 Realm 객체가 INotifyPropertyChanged 를 구현 하기 때문입니다. 및 Realm 컬렉션 이 INotifyCollectionChanged 를 구현. . 라이브 컬렉션과 객체를 UI 에 바인딩하면 UI 와 라이브 객체 및 컬렉션이 동시에 업데이트 됩니다.
데이터 바인딩 예제
다음 코드 스니펫은 세 가지 일반적인 데이터 바인딩 사용 사례에 대한 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()
를 호출해서는 안 됩니다. 이렇게 하면 메모리에서 collection을 강제로 로드하여 결과 collection이 더 이상 라이브 객체가 아닙니다.
단일 Realm 객체에 바인딩
다음 예에서는 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}"/>
Realm collection에 바인딩
바인딩할 수 있는 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 속성 에 바인딩할 수도 있습니다. 이 예에서는 특정 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>
데이터 바인딩 및 MVVM
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}">