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. 동작 시나리오

  1. SomeOtherType은 외부 프레임워크나 특정 서비스 기능을 포함한 사용자 정의 ViewModel 베이스 클래스입니다.
  2. MVVM Toolkit의 [INotifyPropertyChanged]와 [ObservableProperty]를 활용하여
  3. 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 도입 가능

 

 

 

WpfApp1.zip
0.00MB