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개의 좋아요
ICollectionView
는 System.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
에서 수행할 수 있습니다.
| 결과
7개의 좋아요
아…이렇게하면 되는군요…생각보다 간단했네요…감사드립니다…!
2개의 좋아요
공감 표시가 좋아요 표시 밖에 없는 것이 아쉽습니다. 좋은 글입니다!
3개의 좋아요