지난번 글에서는 TextBox 컨트롤의 Text Property에 MainWindowViewModel 클래스의 ObservableProperty Attribute를 갖는 Title 멤버변수를 바인딩 하고 ViewModel 내에서 Title 변수에 값을 변경 하면 그 값이 View에 반영이 되는 것을 확인 했습니다.
이번에는 반대로 UI에서 사용자가 TextBox에 글을 입력하여 바인딩된 Title 변수의 change event callbacks에 대해서 알아보도록 하겠습니다.
ObservableProperty attribute가 선언되면 getter 및 PropertyChanged 이벤트를 호출하는 setter 코드 외에 추가적으로 아래 callback 함수들이 code generator에 의해 자동으로 생성됩니다.
Visual Studio에서 partial을 입력하고 스페이스바나 탭키를 누르면 intellisense가 자동으로 추가 가능한 callback 함수들을 suggestion 리스트에 나열해줍니다.
함수의 Naming convention은 On[멤버변수이름]Changing/Changed 형태로 ObservableProperty attribute가 붙은 member 변수에 대해 자동으로 코드가 생성됩니다. Changing의 경우 해당 변수가 binding된 뷰의 컨트롤에서 변경된 값이 value 인자로 넘어오지만 아직 Title 변수의 setter가 호출되기 이전에 호출되는 callback 함수 입니다. Changed의 경우 Title의 값이 바뀐 다음 호출됩니다.
각 콜백 함수가 호출되는 순서를 확인 해보기 위해 모든 callback 함수에 break point(F9)를 설정해 둡니다.
F5키를 눌러 빌드 후 실행하면 break point 걸어둔 callback 함수 각각에 순서대로 멈추는걸 확인 하실 수 있습니다. Break points를 그대로 두고 F5를 눌러서 프로그램 실행이 continue되게 한 다음 window 창의 TextBox에 값을 변경해 봅니다.
그런데 어찌된 영문인지 TextBox에 아무리 값을 입력해도 change callback의 break points에 걸리지 않는걸 확인 하실 수 있을겁니다.
그 이유는 지난번 글에서 ViewModel의 Title 변수를 바인딩 할 때 Update Trigger 방법을 따로 지정해주지 않아서 default mode로 동작해서 ViewModel의 callback 함수들이 호출되지 않은겁니다.
ViewModel의 callback 함수들은 PropertyChanged 이벤트 발생에 의해서만 trigger 되므로 MainWindow View의 TextBox 바인딩 옵션에 Update Trigger 모드를 아래와 같이 PropertyChanged로 변경해줍니다.
수정 후 View 파일을 저장한 다음 TextBox에 아무키나 눌러서 텍스트를 입력하면 change callback들에 걸어놓은 break point에 바로 걸리는걸 확인하실 수 있습니다.
'Development > WPF' 카테고리의 다른 글
[WPF/CommunityToolkit.Mvvm] 4. WeakReferenceMessenger 사용 (0) | 2023.03.17 |
---|---|
[WPF/CommunityToolkit.Mvvm] 2. ViewModel 작성하고 View에 멤버 변수 바인딩하기 (1) | 2023.02.24 |
[WPF/CommunityToolkit.Mvvm] 1. 프로젝트 생성 후 boilerplate 코드 작성하기 (0) | 2023.02.08 |