30
예제 코드:
INotifyCollectionChanged
는 WPF와 같은 .NET 애플리케이션에서 컬렉션의 변경 사항을 UI나 데이터 바인딩 대상에 알리는 데 사용되는 인터페이스입니다. 이 인터페이스는 컬렉션에 항목이 추가, 삭제, 변경될 때 이를 감지하여 UI에 자동으로 반영하도록 합니다. 일반적으로 ObservableCollection<T>
클래스가 이 인터페이스를 구현하며, 컬렉션의 변경 사항을 자동으로 알릴 수 있습니다.
INotifyCollectionChanged
의 역할
INotifyCollectionChanged
는 컬렉션의 내용이 변경될 때 발생하는CollectionChanged
이벤트를 제공합니다.- 컬렉션의 항목이 추가, 삭제 또는 변경될 때 UI에 변경 사항이 즉시 반영됩니다.
- 이 인터페이스는 주로 UI와 데이터 바인딩된 컬렉션을 다룰 때 사용됩니다.
ObservableCollection<T>
와의 관계
ObservableCollection<T>
는 INotifyCollectionChanged
를 기본적으로 구현하고, 컬렉션의 변경을 감지하고 CollectionChanged
이벤트를 발생시킵니다. 따라서 컬렉션의 요소가 추가, 삭제, 변경될 때 UI가 자동으로 업데이트됩니다.
예제 코드: ObservableCollection<T>
사용
다음 예제는 ObservableCollection<T>
를 사용하여 컬렉션 변경 시 UI가 자동으로 업데이트되는 방법을 보여줍니다.
- ViewModel (MainViewModel.cs)
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace WpfApp241111
{
public class MainViewModel : INotifyPropertyChanged
{
private ObservableCollection<string> _items;
public ObservableCollection<string> Items
{
get { return _items; }
set
{
if (_items != value)
{
_items = value;
OnPropertyChanged(nameof(Items));
}
}
}
public MainViewModel()
{
Items = new ObservableCollection<string> { "Item 1", "Item 2", "Item 3" };
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public void AddItem(string newItem)
{
Items.Add(newItem);
}
public void RemoveItem(string item)
{
if (Items.Contains(item))
Items.Remove(item);
}
}
}
설명
ObservableCollection<string>
:INotifyCollectionChanged
를 구현한 컬렉션으로, 변경 사항이 UI에 반영됩니다.AddItem
및RemoveItem
메서드: 컬렉션에 항목을 추가하거나 제거하는 메서드로, 이 메서드 호출 시CollectionChanged
이벤트가 발생해 UI가 업데이트됩니다.
View와 바인딩 설정
- MainWindow.xaml
<Window x:Class="WpfApp241111.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="INotifyCollectionChanged Example" Height="300" Width="400">
<Grid>
<StackPanel>
<ListBox ItemsSource="{Binding Items}" Width="200" Height="150" Margin="10"/>
<Button Content="Add Item" Width="100" Click="AddItem_Click" Margin="10"/>
<Button Content="Remove Item" Width="100" Click="RemoveItem_Click" Margin="10"/>
</StackPanel>
</Grid>
</Window>
- MainWindow.xaml.cs
using System.Windows;
namespace WpfApp241111
{
public partial class MainWindow : Window
{
private MainViewModel _viewModel;
public MainWindow()
{
InitializeComponent();
_viewModel = new MainViewModel();
this.DataContext = _viewModel;
}
private void AddItem_Click(object sender, RoutedEventArgs e)
{
_viewModel.AddItem("New Item");
}
private void RemoveItem_Click(object sender, RoutedEventArgs e)
{
if (_viewModel.Items.Count > 0)
{
_viewModel.RemoveItem(_viewModel.Items[0]); // 첫 번째 항목을 제거
}
}
}
}
- 결과 사진
설명
ListBox
:ItemsSource
가ObservableCollection<string>
에 바인딩되어, 컬렉션의 변경 사항이 자동으로 반영됩니다.- 버튼 이벤트: 버튼 클릭 시 컬렉션에 항목이 추가되거나 제거되며, 변경 사항이 UI에 즉시 반영됩니다.
요약
INotifyCollectionChanged
는 컬렉션 변경 사항을 감지하고 알리는 기능을 제공합니다.ObservableCollection<T>
는 이 인터페이스를 구현하며 컬렉션의 추가, 삭제, 변경 시CollectionChanged
이벤트를 발생시켜 UI가 자동으로 업데이트됩니다.- WPF 애플리케이션에서 데이터 바인딩과 함께 사용하면 컬렉션과 UI 간의 실시간 동기화를 손쉽게 구현할 수 있습니다.