WPF에서 MVVM 형태로 필터링 하는 방법

ChatGPT, GitHub Copilot에 WPF에서 필터링을 하는 방법을 물어보면

WPF에서 ComboBox에 바인딩 된 ItemsSource에 대해 필터링을 걸고 싶을 때는 Source를 바로 바인딩 하지 말고 CollectionViewSource을 중간에 사용해서 Binding하라고 가이드 합니다.

CollectionViewSource는 WPF의 FCL(Framework Class Library)이므로, ViewModel에서 사용하기에는 적합하지 않은 것 같습니다. → 혹시 CollectionViewSource를 ViewModel에서 사용하지 않고 이용하여 필터링 하는 방법도 있을까요?

ViewModel에서 CollectionViewSource없이 필터링을 하는 방법은 제일 쉬운 건 Collection을 매번 Clear하면서 조건에 맞는 Item을 Add 하는 것 같은데…정말 이 방법 밖에 없을까요?

4 Likes

ICollectionViewSystem.ComponentModel의 구성이므로 이것을 사용하면 됩니다. 다음은 예시 코드에요.

...
<ComboBox ItemsSource="{Binding ItemsCollectionView}" />
...
// MainViewModel.cs
public class MainViewModel
{
    public ICollectionView? ItemsCollectionView
    {
        get; set;
    }

    public string[] Items { get; } =
    [
        "Item 1",
        "Item 2",
        "Item 3",
        "Item 4",
        "Item 5"
    ];
}

하지만 뷰 생성은 CollectionViewSource를 이용해야 하므로 MainWindow.cs에서 해줍니다.

// MainWindow.cs
    public MainWindow()
    {
        InitializeComponent();

        var viewModel = new MainViewModel();
        DataContext = viewModel;

        viewModel.ItemsCollectionView = CollectionViewSource.GetDefaultView(viewModel.Items);
        viewModel.ItemsCollectionView.Filter = (item) =>
        {
            if (item is string s)
            {
                return s.Contains("1");
            }

            return false;
        };
    }

필터 설정은 동작성을 확인하기 위한 목적이므로 ViewModel에서 수행할 수 있습니다.

| 결과
image

7 Likes

아…이렇게하면 되는군요…생각보다 간단했네요…감사드립니다…!

2 Likes

원하시는 게 요런 거에 가까운 건가요?
https://blog.naver.com/vactorman/222574058746

5 Likes

공감 표시가 좋아요 표시 밖에 없는 것이 아쉽습니다. 좋은 글입니다!

3 Likes

와우 감사합니다!! 바로 이것이네요 ㅎㅎ

2 Likes