.NET MAUI - MVVM ObservableObject

2022. 8. 10. 00:00MAUI

반응형

ObservableObject는 INotifyPropertyChanged 및 INotifyPropertyChanging 인터페이스를 구현하여 관찰할 수 있는 개체의 기본 클래스입니다. 속성 변경 알림을 지원해야 하는 개체 종류의 시작점으로 사용할 수 있습니다.

 

  • PropertyChanged 및 PropertyChanging 이벤트를 노출합니다.
  • 이벤트를 자동으로 발생시키는 데 사용할 수 있는 일련의 SetProperty 메서드를 제공합니다.
  • SetProperty와 유사하지만 할당된 작업이 완료되면 작업 속성을 설정하고 알림 이벤트를 자동으로 발생시키는 기능이 있는 SetPropertyAndNotifyOnCompletion 메서드를 제공합니다.
  • 알림 이벤트가 발생하는 방법을 사용자 지정하기 위해 파생된 형식에서 재정의할 수 는 OnPropertyChanged 및 OnPropertyChanging 메서드를 노출합니다.

 

기본 생성

public class User : ObservableObject
{
    private string name;

    public string Name
    {
        get => name;
        set => SetProperty(ref name, value);
    }
}

제공된 SetProperty<T>(ref T, T, string) 메서드는 속성의 현재 값을 확인하고 다르면 업데이트하고 관련 이벤트도 자동으로 발생시킵니다. 속성 이름은 [CallerMemberName] 특성을 사용하여 자동으로 캡처되므로 업데이트할 속성을 수동으로 지정할 필요가 없습니다.

 

Non Observable Model Wrapping

예를 들어 데이터베이스 항목으로 작업할 때 일반적인 시나리오는 데이터베이스 모델의 속성을 릴레이하고 필요할 때 속성 변경 알림을 발생시키는 래핑 "결합 가능한" 모델을 만드는 것입니다. 이는 INotifyPropertyChanged 인터페이스를 구현하지 않는 모델에 알림 지원을 삽입하려는 경우에도 필요합니다. ObservableObject는 이 프로세스를 더 간단하게 만드는 전용 메서드를 제공합니다. 다음 예에서 User는 ObservableObject에서 상속하지 않고 데이터베이스 테이블을 직접 매핑하는 모델입니다.

public class ObservableUser : ObservableObject
{
    private readonly User user;

    public ObservableUser(User user) => this.user = user;

    public string Name
    {
        get => user.Name;
        set => SetProperty(user.Name, value, user, (u, n) => u.Name = n);
    }
}

SetProperty<TModel, T>(T, T, TModel, Action<TModel, T>, string)

  • T oldValue는 첫 번째 매개변수이며, 이 경우 user.Name을 사용하여 우리가 래핑하는 해당 속성의 현재 값을 전달합니다.
  • T newValue는 속성에 설정할 새 값이며 여기에서는 속성 설정자 내의 입력 값인 값(value)을 전달합니다.
  • TModel 모델은 우리가 래핑하는 대상 모델이며, 이 경우 사용자 필드에 저장된 인스턴스(user)를 전달합니다.
  • Action<TModel, T> 콜백은 속성의 새 값이 현재 값과 다르고 속성을 설정해야 하는 경우 호출되는 함수입니다. 이것은 대상 모델과 설정할 새 속성 값을 입력으로 받는 이 콜백 함수에 의해 수행됩니다.

SetProperty<TModel, T>(T, T, TModel, Action<TModel, T>, string) 메서드는 매우 간단한 API를 제공하면서 대상 속성 검색 및 설정을 모두 처리하므로 이러한 래핑 속성을 매우 간단하게 생성할 수 있습니다.

 

특히 상태 및 콜백 매개 변수 대신 Expression<Func<T>> 형식의 매개 변수를 통해 LINQ 식을 사용하여 이 메서드를 구현하는 것과 비교할 때 이 방법으로 달성할 수 있는 성능 향상은 매우 중요합니다. 특히, 이 버전은 LINQ 표현식을 사용하는 버전보다 ~200배 빠르며 메모리를 전혀 할당하지 않습니다.

 

Task<T> properties

속성이 작업인 경우 작업이 완료되면 알림 이벤트도 발생시켜 바인딩이 적시에 업데이트되도록 해야 합니다. 예를 들어 작업이 나타내는 작업에 대한 로딩 표시기 또는 기타 상태 정보를 표시합니다. ObservableObject에는 이 시나리오에 대한 API가 있습니다.

public class MyModel : ObservableObject
{
    private TaskNotifier<int>? requestTask;

    public Task<int>? RequestTask
    {
        get => requestTask;
        set => SetPropertyAndNotifyOnCompletion(ref requestTask, value);
    }

    public void RequestValue()
    {
        RequestTask = WebService.LoadMyValueAsync();
    }
}

여기서 SetPropertyAndNotifyOnCompletion<T>(ref TaskNotifier<T>, Task<T>, string) 메서드는 대상 필드 업데이트, 새 작업 모니터링(있는 경우), 해당 작업 완료 시 알림 이벤트 발생을 처리합니다. 이렇게 하면 작업 속성에 바인딩하고 상태가 변경될 때 알림을 받을 수 있습니다.

 

SetPropertyAndNotifyOnCompletion 메서드는 Microsoft.Toolkit 패키지의 NotifyTaskCompletion<T> 형식 사용을 대체하기 위한 것입니다. 이 유형이 사용 중이면 내부 Task(또는 Task<TResult>) 속성으로 대체할 수 있으며 SetPropertyAndNotifyOnCompletion 메서드를 사용하여 해당 값을 설정하고 알림 변경 사항을 발생시킬 수 있습니다. NotifyTaskCompletion<T> 유형에 의해 노출되는 모든 속성은 Task 인스턴스에서 직접 사용할 수 있습니다.

 

 

관련영상

https://youtu.be/zR1ARYgPh9M

 

 

반응형

'MAUI' 카테고리의 다른 글

.NET MAUI - MVVM ObservableValidator  (0) 2022.08.12
.NET MAUI - MVVM ObservableRecipient  (0) 2022.08.11
.NET MAUI - MVVM and CommunityToolkit.Mvvm  (0) 2022.08.09
.NET MAUI - Behaviors  (0) 2022.08.08
.NET MAUI - Triggers (2)  (0) 2022.08.05