해당 포스팅은 개인적으로 C# WPF를 공부하면서 익힌 내용을 기억에 남기기 위한 작업의 일환으로 작성된 글로서
일부 내용에 오류가 있을 수도 있으니 참고하시기 바랍니다.
C#WPF에서 MVVM패턴으로
프로그래밍 할때 OnPropertyChanged
의 역할에 대해
알아보자.
내용 요약
MVVM (Model-View-ViewModel) 패턴은 WPF (Windows Presentation Foundation) 애플리케이션에서 데이터 바인딩을 통해 UI와 비즈니스 로직을 분리하는 데 사용된다. 이 패턴에서 INotifyPropertyChanged 인터페이스는 ViewModel이 속성의 변경을 View에 알리는 데 중요한 역할을 한다. 이 과정에서 OnPropertyChanged 메서드가 핵심적인 역할을 하는데, 이번 포스팅에서는 어떠한 역할을 하는지 알아보도록 하자.
목차
1.INotifyPropertyChanged 인터페이스
2.OnPropertyChanged 메서드
3.ViewModel의 속성 구현
4.XAML에서의 데이터 바인딩
5.예외 처리 및 성능 고려사항
6.예제: 복잡한 ViewModel
7.결론
1.INotifyPropertyChanged 인터페이스
INotifyPropertyChanged 인터페이스는 속성이 변경될 때 알림을 제공하는 메커니즘을 정의한다. 이 인터페이스는 다음과 같은 이벤트를 포함한다
public interface INotifyPropertyChanged
{
event PropertyChangedEventHandler PropertyChanged;
}
이벤트 PropertyChanged는 속성이 변경될 때 발생한다. ViewModel에서 속성이 변경되면 이 이벤트를 발생시켜 UI에 변경 사항을 알리게 된다.
2.OnPropertyChanged 메서드
OnPropertyChanged 메서드는 속성이 변경될 때 호출되어 PropertyChanged 이벤트를 발생시키는 역할을 한다. 일반적으로 ViewModel 클래스에서 다음과 같이 구현된다.
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
이 메서드는 propertyName 매개변수로 변경된 속성의 이름을 받아서 해당 속성이 변경되었음을 알린다. PropertyChanged 이벤트가 구독되어 있다면, 구독자에게 알림을 보낸다.
3.ViewModel의 속성 구현
ViewModel에서 속성을 구현할 때, 속성의 setter에서 OnPropertyChanged를 호출하여 속성이 변경되었음을 알린다. 예를 들어, 다음과 같은 ViewModel을 고려해 보자.
public class PersonViewModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
위의 예제에서 Name 속성의 setter는 _name의 값이 변경될 때만 OnPropertyChanged를 호출한다. 이렇게 하면 UI는 Name 속성이 변경되었음을 인식하고 자동으로 업데이트된다.
4.XAML에서의 데이터 바인딩
WPF에서는 XAML을 사용하여 UI를 정의하고, ViewModel의 속성과 UI 요소를 바인딩할 수 있다. 예를 들어, PersonViewModel을 사용하여 UI를 구성할 수 있다.
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MVVM Example" Height="200" Width="300">
<Grid>
<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</Window>
위의 XAML 코드에서 TextBox의 Text 속성은 Name 속성과 바인딩되어 있다. 사용자가 텍스트 박스에 입력할 때마다 Name 속성이 업데이트되고, OnPropertyChanged가 호출되어 UI가 자동으로 업데이트된다.
5.예외 처리 및 성능 고려사항
속성 변경 알림을 구현할 때는 몇 가지 고려사항이 있다.
- 예외 처리: OnPropertyChanged 메서드에서 예외가 발생할 수 있으므로, 적절한 예외 처리를 구현하는 것이 좋다.
- 성능: 많은 속성이 있는 ViewModel에서 모든 속성에 대해 OnPropertyChanged를 호출하면 성능에 영향을 줄 수 있으므로, 이 경우, 변경된 속성만 알리도록 최적화할 수 있다.
6.예제: 복잡한 ViewModel
복잡한 ViewModel에서는 여러 속성을 관리할 수 있다. 다음은 여러 속성을 가진 ViewModel의 예이다.
public class EmployeeViewModel : INotifyPropertyChanged
{
private string _firstName;
private string _lastName;
private int _age;
public string FirstName
{
get { return _firstName; }
set
{
if (_firstName != value)
{
_firstName = value;
OnPropertyChanged(nameof(FirstName));
}
}
}
public string LastName
{
get { return _lastName; }
set
{
if (_lastName != value)
{
_lastName = value;
OnPropertyChanged(nameof(LastName));
}
}
}
public int Age
{
get { return _age; }
set
{
if (_age != value)
{
_age = value;
OnPropertyChanged(nameof(Age));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
이 ViewModel은 직원의 이름과 나이를 관리한다. 각 속성의 setter에서 OnPropertyChanged를 호출하여 UI에 변경 사항을 알린다
7.결론
OnPropertyChanged 메서드는 WPF MVVM 패턴에서 데이터 바인딩을 통해 UI와 ViewModel 간의 상호작용을 가능하게 하는 중요한 요소이다. 이를 통해 UI는 ViewModel의 상태를 자동으로 반영할 수 있으며, 개발자는 UI와 비즈니스 로직을 효과적으로 분리할 수 있다.
MVVM 패턴을 활용하면 유지보수성과 테스트 용이성이 향상되며, 더 나은 사용자 경험을 제공할 수 있다.
이와 같은 방식으로 OnPropertyChanged를 활용하여 WPF 애플리케이션을 개발하면, 데이터의 변경 사항을 UI에 실시간으로 반영할 수 있으므로 MVVM 패턴을 잘 이해하고 활용하도록 하자.
'프로그래밍 > C# (WPF)' 카테고리의 다른 글
C# WPF에서 MVVM패턴으로 프로그래밍 할 때, View와 ViewModel간 DataContext 설정하는 방법에 대해 (1) | 2024.11.27 |
---|---|
C# WPF에서 MVVM패턴으로 프로그래밍 할 때 알아야 할 중요한 개념 중 Dependency Injection (DI)에 대해 (1) | 2024.11.25 |
C# WPF MVVM패턴을 사용할 때 ObservableCollection에 대하여 (0) | 2024.11.24 |
C# WPF MVVM패턴에서 ICommand 인터페이스에 대하여 (2) | 2024.11.23 |
C# WPF에서 MVVM 패턴을 사용할 때 INotifyPropertyChanged 인터페이스에 대하여 (0) | 2024.11.22 |