03.3 INotifyPropertyChanged

1️⃣ INotifyPropertyChanged
📚 Microsoft Learn / Learn / .NET / MVVM

✅ [INotifyPropertyChanged] 개요
클래스에 INotifyPropertyChanged 인터페이스를 자동 구현하게 해주는 '어트리뷰트' 입니다.
INotifyPropertyChanged 인터페이스와 다릅니다.
✅ [INotifyPropertyChanged] 사용 예시

[INotifyPropertyChanged] public partial class MyViewModel { public string Name { get; set; } }
✅ [ObservableProperty] 비교

public partial class MyViewModel : ObservableObject { [ObservableProperty] private string name; }
✅ [INotifyPropertyChanged] 사용하는 대표적인 경우
public class MyCustomBaseViewModel { // 공통적으로 사용하는 속성 또는 메서드 public string AppTitle => "My Application"; public virtual void Initialize() { // 공통 초기화 로직 } }
[INotifyPropertyChanged] public partial class MyViewModel : MyCustomBaseViewModel { [ObservableProperty] private string status; }
[INotifyPropertyChanged]는 클래스 수준에서 적용되고, [ObservableProperty]는 프로퍼티 수준에서 사용됩니다.
[INotifyPropertyChanged]는 [ObservableProperty]의 프로퍼티 자동 생성과 같은 기능이 없지만,
ViewModel base class와 제약없이 상속 구현할 수 있기 때문에 확장성 있는 구현이 가능합니다.
그렇기 때문에 기존 베이스 클래스 구조에 MVVM 기능을 공존시킬 수 있습니다.
2️⃣ 예제1
*CommunityToolkit.Mvvm 패키지 설치 후 진행해주세요.
✔️ 1. 동작 시나리오

- SomeOtherType은 외부 프레임워크나 특정 서비스 기능을 포함한 사용자 정의 ViewModel 베이스 클래스입니다.
- MVVM Toolkit의 [INotifyPropertyChanged]와 [ObservableProperty]를 활용하여
- UI 자동 업데이트 기능을 구현
✔️ 2. 순수 C#으로 INotifyPropertyChanged 구현
📁 2.1 프로젝트 구조
MyExtendedApp/ ├── ViewModels/ │ └── SomeOtherType.cs │ └── MyViewModel.cs ├── MainWindow.xaml └── MainWindow.xaml.cs
📁 2.2 Base 클래스 만들기
//Base 클래스에 서비스 주입, 공통 속성, 로거, 메시징 처리 등을 자유롭게 구현가능합니다. public class SomeOtherType { public virtual void Log(string message) { Console.WriteLine($"[Log] {message}"); } }
📁 2.3 ViewModel 클래스 만들기
// [INotifyPropertyChanged]는 이 클래스가 INotifyPropertyChanged 인터페이스를 구현하게 해줍니다. // 즉, 속성(Property)이 변경될 때 WPF 바인딩 시스템이 이를 감지하고 UI를 자동으로 갱신할 수 있게 합니다. // 이 어트리뷰트를 사용하면 PropertyChanged 이벤트와 관련 메서드를 직접 구현하지 않아도 됩니다. [INotifyPropertyChanged] public partial class MainViewModel : SomeOtherType { // TextBox에 바인딩된 사용자 입력값 저장용 속성 // [ObservableProperty]는 private 필드와 함께 public 속성을 자동 생성하고 // 값이 변경될 때 INotifyPropertyChanged를 통해 자동으로 PropertyChanged 이벤트를 발생시킵니다. [ObservableProperty] private string userInput; // 결과 메시지를 저장하고 TextBlock에 바인딩될 속성 [ObservableProperty] private string result; // MVVM 커맨드로 사용할 메서드 // [RelayCommand]는 이 메서드에 대해 ProcessCommand 속성을 자동 생성하며, // ICommand 인터페이스를 구현하여 WPF에서 Command 바인딩에 사용할 수 있게 합니다. [RelayCommand] private void Process() { // 사용자 입력을 기반으로 결과 메시지 구성 Result = $"입력한 값: {UserInput}"; // SomeOtherType에 정의된 로그 출력 기능 호출 (확장성 예시) Log("Process executed"); } }
📁 2.4 XAML 화면 구성하기
xmlns:vm="clr-namespace:WpfApp1.ViewModels" Title="[INotifyPropertyChanged] 확장 예제" Height="200" Width="400"> <Window.DataContext> <vm:MainViewModel /> </Window.DataContext> <StackPanel Margin="20"> <TextBox Text="{Binding UserInput, UpdateSourceTrigger=PropertyChanged}" Width="250" Height="30" Margin="0 0 0 10"/> <Button Content="처리하기" Width="100" Height="30" Command="{Binding ProcessCommand}" /> <TextBlock Text="{Binding Result}" FontSize="16" Margin="10 0 0 0"/> </StackPanel>
✔️ 3. 확장성
항목 | 설명 |
기존 클래스 | SomeOtherType (기존 비-MVVM 구조) |
MVVM 적용 방식 | [INotifyPropertyChanged]로 기존 클래스를 확장 |
상태 관리 | [ObservableProperty]로 ViewModel 내부 상태 관리 |
UI 연동 | WPF의 Binding + MVVM Toolkit으로 자동 UI 갱신 |
장점 | 기존 프레임워크와의 충돌 없이 MVVM 도입 가능 |
댓글을 사용할 수 없습니다.