[WPF] 검색과 정렬
최근에 프로젝트를 진행하면서 ListView Control을 하며 어려웠던 부분을 정리하였습니다.
👉 기본 환경
- Language: C#, xaml
- IDE: Visual Basic 2022
끝날 때까지 끝난 게 아니라는 멋진 말은 제 코드에도 적용이 됩니다😱.
왜냐면 검색을 하고 정렬을 하면, 검색은 사라져버리기 때문입니다.
원래 검색과 정렬 사이가 이렇게 나빴나..😮
생각을 하며.. 해결해봅시다.
단순하게 생각하면, Search된 데이터를 기반으로 Sort 메서드를 나누면 되겠다고 생각해서 코드를 추가해봅니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
private void SortToDoItems(string selectedSortOption)
{
if (String.IsNullOrWhiteSpace(ToDoItemSearchText))
{
switch (selectedSortOption)
{
case "Tag":
ToDoList = new ObservableCollection<ToDoItem>(OriginalToDoList.OrderBy(x => x.Tag));
break;
case "RegisteredDate":
ToDoList = new ObservableCollection<ToDoItem>(OriginalToDoList.OrderBy(x => x.RegisteredDate));
break;
case "Complete":
ToDoList = new ObservableCollection<ToDoItem>(OriginalToDoList.OrderByDescending(x => x.isComplete));
break;
default:
return;
}
}
else
{
switch (selectedSortOption)
{
case "Tag":
ToDoList = new ObservableCollection<ToDoItem>(SearchToDoList.OrderBy(x => x.Tag));
break;
case "RegisteredDate":
ToDoList = new ObservableCollection<ToDoItem>(SearchToDoList.OrderBy(x => x.RegisteredDate));
break;
case "Complete":
ToDoList = new ObservableCollection<ToDoItem>(SearchToDoList.OrderByDescending(x => x.isComplete));
break;
default:
return;
}
}
}
|
SearchToDoList를 추가적으로 선언해서 만일 검색어가 있을 경우에는 OriginalToDoList가 아닌 검색 데이터 리스트가 들어있는 SearchToDoList를 기반으로 정렬을 합니다.
됩니다🤓.
하지만 검색어를 지우고 난 이후의 데이터는 정렬이 되지 않은 상태가 됩니다🫠.
🚨 스카치 테이프로 코드 돌려막기 시즌2가 시작됩니다.
정렬된 데이터를 담는 리스트도 추가로 선언해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
private void SortToDoItems(string selectedSortOption)
{
switch (selectedSortOption)
{
case "Tag":
ToDoList = new ObservableCollection<ToDoItem>(OriginalToDoList.OrderBy(x => x.Tag));
break;
case "RegisteredDate":
ToDoList = new ObservableCollection<ToDoItem>(OriginalToDoList.OrderBy(x => x.RegisteredDate));
break;
case "Complete":
ToDoList = new ObservableCollection<ToDoItem>(OriginalToDoList.OrderByDescending(x => x.isComplete));
break;
default:
return;
}
SortToDoList = new ObservableCollection<ToDoItem>(ToDoList);
if(!String.IsNullOrWhiteSpace(ToDoItemSearchText))
{
switch (selectedSortOption)
{
case "Tag":
ToDoList = new ObservableCollection<ToDoItem>(SearchToDoList.OrderBy(x => x.Tag));
break;
case "RegisteredDate":
ToDoList = new ObservableCollection<ToDoItem>(SearchToDoList.OrderBy(x => x.RegisteredDate));
break;
case "Complete":
ToDoList = new ObservableCollection<ToDoItem>(SearchToDoList.OrderByDescending(x => x.isComplete));
break;
default:
return;
}
}
}
|
모든 데이터를 정렬한 데이터를 담는 SortToDoList를 기본으로 실행하고, 검색어가 있는 경우에는 OriginalToDoList 대신 검색된 데이터가 담긴 SearchToDoList를 이용합니다.
그 다음 검색 데이터 베이스를 SortToDoList로 변경해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
private void SearchToDoItemsEvent(object obj)
{
if (String.IsNullOrWhiteSpace(ToDoItemSearchText))
{
ToDoList = new ObservableCollection<ToDoItem>(SortToDoList);
SearchToDoList = new ObservableCollection<ToDoItem>(ToDoList);
}
else
{
string searchText = ToDoItemSearchText.ToLower();
var filteredList = SortToDoList.Where(item => item.Tag.ToLower().Contains(searchText)).ToList();
ToDoList = new ObservableCollection<ToDoItem>(filteredList);
SearchToDoList = new ObservableCollection<ToDoItem>(filteredList);
}
}
|
⭐ 간단하게 정리하면,
원본 데이터를 가지고 있는 OriginalToDoList
화면에 보여지는 ToDoList
검색된 데이터를 가지고 있는 SearchToDoList
정렬된 데이터를 가지고 있는 SortToDoList
가 있고 원하는 동작에 따라 Base ToDoList를 변경해줘야합니다.