c#/세미나

[세미나] Blazor / WPF / MAUI 밋업 (INotifyPropertyChanged 구현)

루다대디 2024. 4. 5. 10:45

[ObservableProperty] 어트리뷰트 활용

보통은 아래 코드처럼

CommunityToolkit.Mvvm을 통해 속성 자체를 생략하여 편리하게 사용하지만

[ObservableProperty]
private _title { get; set; }

 

INotifyPropertyChanged 를 직접 구현해보고

이해하는것은 MVVM을 이해하는대에 큰 도움이 된다

 

위 코드가 나오기까지 어떠한 과정들이 생략 되었는지 알아보자


INotifyPropertyChanged 구현

MVVM 패턴의 실체와도 같은 INotifyPropertyChanged를 통해 바인딩 가능한 속성을 만들게 된다

또한 WindowsBase.dll에 포함된 이 상징적인 인터페이스를 한번 들여다 볼 필요가 있다생각보다 많은 WPF 개발자들이 이를 직접 구현하여 사용하기도 한다

 

나또한 MVVM을 처음 접했을때 라이브러리를 사용하지않고,직접 구현하여 사용하였는데이번 세미나에서 INotifyPropertyChanged 구현에 관련된 내용이 나와 반가웠다

 

 

public class MainWindowViewmodel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

 

이 인터페이스는 OnPropertyChanged 메서드를 인터페이스 멤버로 구현하도록 한다

그리고 Setter를 통해 속성의 변화를 뷰에서 감지하도록 알리는 로직을 구현할 수 있게 된다

private string _title;

public string Title 
{
    get 
    {
        return _title;
    }
    set 
    {
        _title = value; OnPropertyChanged("Title");
    }
}

 

이방식은 아주 클래식한 문법이다

Title 속성의 이름을 문자열로 직접 입력하여 보내게 된다

하지만 이 방식은 속성의 이름이 변경되었을 때도 싱크를 함께 맞추어야 하며

오타를 범할 수 도 있게 된다

 


nameof 활용

더 좋은방법은 nameof를 활용하는것이다

set 
{
    _title = value; OnPropertyChanged(nameof(Title));
}

 

이렇게 되면 속성 이름의 오타를 범하는 실수를 방지하고

속성 이름 변경에 따른 추가 작업을 줄일 수 있다

 

    internal class MainWindowViewmodel : INotifyPropertyChanged
    {
        private string _title = string.Empty;

        public string Title
        {
            get { return _title; }
            set { _title = value; OnPropertyChanged(nameof(Title)); }
        }


        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }