C#/WPF

[WPF] 검색과 정렬

HJ0216 2024. 3. 10. 13:47

최근에 프로젝트를 진행하면서 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를 변경해줘야합니다.