» [WPF] INotifiCollectionChanged

[WPF] INotifiCollectionChanged

by DUBUKIMCH

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에 반영됩니다.
  • AddItemRemoveItem 메서드: 컬렉션에 항목을 추가하거나 제거하는 메서드로, 이 메서드 호출 시 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: ItemsSourceObservableCollection<string>에 바인딩되어, 컬렉션의 변경 사항이 자동으로 반영됩니다.
  • 버튼 이벤트: 버튼 클릭 시 컬렉션에 항목이 추가되거나 제거되며, 변경 사항이 UI에 즉시 반영됩니다.

요약

  • INotifyCollectionChanged는 컬렉션 변경 사항을 감지하고 알리는 기능을 제공합니다.
  • ObservableCollection<T>는 이 인터페이스를 구현하며 컬렉션의 추가, 삭제, 변경 시 CollectionChanged 이벤트를 발생시켜 UI가 자동으로 업데이트됩니다.
  • WPF 애플리케이션에서 데이터 바인딩과 함께 사용하면 컬렉션과 UI 간의 실시간 동기화를 손쉽게 구현할 수 있습니다.

You may also like

Leave a Comment

error: Content is protected !!