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 를 적용하여 보여줄 수 있다.
나에겐 혁명같은 기능이었다... 👍
'WPF' 카테고리의 다른 글
[WPF] Behavior 를 이용하여 xaml 에서 값 변경하기 (0) | 2024.07.12 |
---|---|
[WPF] Radio Button 에 enum 을 이용한 Converter 사용법 (0) | 2024.07.11 |
[WPF] View 를 미리 랜더링 하는 방법 (0) | 2024.07.01 |
[WPF] 가변 DataGrid (0) | 2024.06.28 |
[WPF] DataGrid 유동적인 Row, Column 개수 구성 (0) | 2024.06.21 |