WPF

[WPF] ObservableCollection Filtering 사용법 (ICollectionView)

Chanhongv 2024. 7. 4. 11:10

ItemsControl 를 이용하다보면 Filtering 을 해야할 경우가 생긴다.

 

내가 기존에 사용하던 것은

        public ObservableCollection<Module>? Modules { get; set; }

 

위 속성을 ItemsControl 에 ItemsSource 에 바인딩하여 보여주고 있었는데

TextBox 를 추가하여 Filter 해야하는 일이 생겼다.

 

 

위 이미지 처럼 입력한 text 만 찾을 수 있는 기능이 필요했다.

 

 public ICollectionView FilteredModules { get; set; } 
  
 // init
 FilteredModules = CollectionViewSource.GetDefaultView(Modules);
 OnPropertyChanged(nameof(FilteredModules));

// Text 가 변경될때마다 발생되는 함수
private void OnSearchModuleName(string str)
{
    if (string.IsNullOrEmpty(str))
    {
        FilteredModules.Filter = null;
    }
    else
    {
        FilteredModules.Filter = x => ((Module)x).ModuleName?.Contains(str) ?? false;
    }
    FilteredModules.Refresh();
}
<ItemsControl ItemsSource="{Binding FilteredModules}">

 

ICollectionView 를 이용하면 기존 ObservableCollection 은 건들지 않고

Binding 만 바꿔주어서 Filter 를 적용하여 보여줄 수 있다.

 

나에겐 혁명같은 기능이었다... 👍