상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - MVVM에서 뷰모델의 속성을 변경할 때 UI를 업데이트하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
MVVM(모델-뷰-뷰모델) 패턴은 UI와 비즈니스 로직을 분리하여 유지보수성과 테스트 용이성을 높이는 아키텍처 패턴입니다. MVVM에서 뷰모델(ViewModel)은 UI의 상태를 관리하고, 모델(Model)과 뷰(View) 간의 <a href='https://sangseek.com/sangseeks/데이터 바인딩/ko'>데이터 바인딩</a>을 통해 UI를 업데이트합니다. 뷰모델의 속성이 변경될 때 UI를 업데이트하는 방법은 주로 데이터 바인딩과 이벤트 알림을 통해 이루어집니다. 1. 데이터 바인딩 MVVM에서 데이터 바인딩은 뷰와 뷰모델 간의 연결을 설정하여, 뷰모델의 속성이 변경될 때 자동으로 UI가 업데이트되도록 합니다. 데이터 바인딩은 주로 다음과 같은 방식으로 구현됩니다: - Binding : UI 요소의 속성을 뷰모델의 속성과 연결합니다. 예를 들어, <a href='https://sangseek.com/sangseeks/WPF/ko'>WPF</a>에서는 XAML을 사용하여 다음과 같이 바인딩을 설정할 수 있습니다. ```xml <<a href='https://sangseek.com/sangseeks/TextBox/ko'>TextBox</a> Text="{Binding Name, <a href='https://sangseek.com/sangseeks/Update/ko'>Update</a>SourceTrigger=PropertyChanged}" /> ``` 여기서 `Name`은 뷰모델의 속성이고, `TextBox`의 `Text` 속성과 바인딩됩니다. `UpdateSourceTrigger=PropertyChanged`는 속성이 변경될 때마다 UI를 업데이트하도록 설정합니다. 2. INotifyPropertyChanged 인터페이스 뷰모델에서 속성이 변경될 때 UI에 알리기 위해 `INotifyPropertyChanged` 인터페이스를 구현합니다. 이 인터페이스는 속성이 변경되었음을 알리는 `PropertyChanged` 이벤트를 제공합니다. 뷰모델의 속성이 변경될 때 이 이벤트를 발생시켜 UI에 변경 사항을 알립니다. ```csharp public class MyViewModel : INotifyPropertyChanged { private string _name; public string Name { get { return _name; } set { if (_name != value) { _name = value; OnPropertyChanged(nameof(Name)); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 위의 예제에서 `Name` 속성이 변경되면 `OnPropertyChanged` 메서드가 호출되어 `PropertyChanged` 이벤트가 발생합니다. 이로 인해 바인딩된 UI 요소가 자동으로 업데이트됩니다. 3. Command 패턴 MVVM에서는 UI의 이벤트(예: 버튼 클릭)를 처리하기 위해 Command 패턴을 사용합니다. 뷰모델에서 ICommand 인터페이스를 구현한 커맨드를 정의하고, 이를 UI 요소에 바인딩합니다. 커맨드가 실행될 때 뷰모델의 상태를 변경하고, 이로 인해 UI가 업데이트됩니다. ```csharp public class RelayCommand : ICommand { private readonly Action<object> _execute; private readonly Predicate<object> _canExecute; public RelayCommand(Action<object> execute, Predicate<object> canExecute = null) { _execute = execute; _canExecute = canExecute; } public event EventHandler CanExecuteChanged; public <a href='https://sangseek.com/sangseeks/bool/ko'>bool</a> CanExecute(object parameter) { return _canExecute == null || _canExecute(parameter); } public void Execute(object parameter) { _execute(parameter); } public void RaiseCanExecuteChanged() { CanExecuteChanged?.Invoke(this, EventArgs.Empty); } } ``` 뷰모델에서 커맨드를 정의하고, UI에서 이를 바인딩하여 사용합니다. ```csharp public class MyViewModel : INotifyPropertyChanged { public ICommand MyCommand { get; } public MyViewModel() { MyCommand = new RelayCommand(ExecuteMyCommand); } private void ExecuteMyCommand(object parameter) { // 명령 실행 로직 } } ``` 4. ObservableCollection 컬렉션을 다룰 때는 `ObservableCollection<T>`를 사용하여 컬렉션의 변경 사항을 UI에 자동으로 반영할 수 있습니다. `ObservableCollection`은 아이템이 추가되거나 제거될 때 `CollectionChanged` 이벤트를 발생시켜 UI를 업데이트합니다. ```csharp public class MyViewModel { public ObservableCollection<string> Items { get; set; } public MyViewModel() { Items = new ObservableCollection<string>(); } } ``` 결론 MVVM 패턴에서 뷰모델의 속성이 변경될 때 UI를 업데이트하는 방법은 데이터 바인딩, `INotifyPropertyChanged` 인터페이스, Command 패턴, 그리고 `ObservableCollection`을 활용하는 것입니다. 이러한 기법들을 통해 UI와 비즈니스 로직을 효과적으로 분리하고, 사용자 인터페이스의 반응성을 높일 수 있습니다. MVVM 패턴을 올바르게 구현하면 코드의 재사용성과 유지보수성을 크게 향상시킬 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기