WPF INotifyPropertyChanged

INotifyPropertyChanged 인터페이스의 PropertyChanged 이벤트 쓰시는 분 있으신가요?
저는 개발할 때 자주 쓰는 편이라 올려봅니다.
PropertyChangedBase는 MVVM Framework중 Caliburn.Micro를 사용하였습니다.

public class MainWindowViewModel : PropertyChangedBase
    {
        private string _strTest;
        public string StrTest
        {
            get => _strTest;
            set => Set(ref _strTest, value);
        }

        private int _intTest;
        public int IntTest
        {
            get => _intTest;
            set => Set(ref _intTest, value);
        }

        public MainWindowViewModel()
        {
            this.PropertyChanged += MainWindowViewModel_PropertyChanged;
        }

        private void MainWindowViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            switch (e.PropertyName)
            {
                case nameof(StrTest):
                    if (!string.IsNullOrEmpty(StrTest))
                    {
                        //TODO:
                    }
                    break;
                case nameof(IntTest):
                    if (IntTest > 0)
                    {
                        //TODO:
                    }
                    break;

                default:
                    break;
            }
        }
    }
4개의 좋아요

INotifyPropertyChanged 없으면 개발 못하는 수준이죠 ㅎㅎ MVVM 패턴에서 빠질 수 없으니까요.

3개의 좋아요

저의 경우에는 정말 말 그대로 Property Changed 했다는 알림을 주기 위한 용도 이외에는 사용하지 않습니다.

위 코드에서 Set 했을 때 Update 했음을 알린다면 StrTest 값 변경 시 처리할 작업이 IntTest 알림일 때도 호출하기 때문에 Binding 된 Property가 많다면 불필요한 비용이 많이 발생할 것 같아요.
보통은 UI 쓰레드에서 이를 처리하는데 비용이 큰 작업이 포함됐거나 빈번히 호출될 경우 사용자가 봤을 때 화면이 버벅이는 느낌을 받을 수 있을 것 같아요.

이를 해결하기 위해서 저는 setter 내부에 필요한 기능을 구현하거나 필요한 기능이 구현된 함수를 추가하여 해결합니다.
비용이 큰 건이 있다면 비동기 작업을 추가하기도 합니다.

물론 위 내용은 제 개인적인 습관(?)입니다 :slight_smile:

3개의 좋아요

제가 계속해서 개발해 오는 두가지 WPF 있습니다. 하나는 비디오/오디오 프로세싱 (60 Hz 초당) 또 하나는 패킷레벌 프로세싱 (많게는 초당 160 Mbps) 정도 됩니다. 많은 데이타 처리와 함께 모든 데이타 변화를 보여주여야 하기에 INotifyPropertyChanged 를 사용하고 있으나 불필요한 비용은 생기지 않습니다. 저의 팀의 경우에는 절대로 뷰와 뷰모델에 어떠한 로직이나 코드가 없습니다. 오직 INotifyPropertyChanged 와 get / set 뿐이고 모든 처리는 모델에서 이루어 집니다. 그래서 Blazor 작업할때도 수월하게 할수 있었습니다.

3개의 좋아요