WPFのListViewを文字検索で絞り込み

C# コンピュータ
C#

ICollectionViewのFilterを使うと絞り込みが出来るようなので試してみます。

ソースコード

<Window x:Class="ListViewFilter01.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ListViewFilter01"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DockPanel>
            <DockPanel
                Margin="2"
                DockPanel.Dock="Top">
                <DockPanel>
                    <Label
                        DockPanel.Dock="Left"
                        >検索</Label>
                    <TextBox
                        x:Name="Keyword"></TextBox>
                </DockPanel>
            </DockPanel>
            <ListView ItemsSource="{Binding Files}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="200">
                            <GridViewColumnHeader
                                Content="名前" />
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock
                                        Width="100"
                                        TextAlignment="Left"
                                        Text="{Binding Name}" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Width="200">
                            <GridViewColumnHeader
                                Content="長さ" />
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock
                                        Width="100"
                                        TextAlignment="Right"
                                        Text="{Binding Length}" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>    
                </ListView.View>
            </ListView>
        </DockPanel>
    </Grid>
</Window>
using System.Windows;
using System.Windows.Data;

using System.Collections.ObjectModel;

namespace ListViewFilter01;

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public class FilesItem
    {
        public string Name { get; set; } = "";
        public int Length { get; set; } = 0;
    }
    public ObservableCollection<FilesItem> Files { get; set; } = [];
    public MainWindow()
    {
        InitializeComponent();

        Files.Add(new FilesItem(){Name = "白箱.txt", Length = 600 });
        Files.Add(new FilesItem(){Name = "猫の本.txt", Length = 300 });
        Files.Add(new FilesItem(){Name = "犬の本.txt", Length =  50 });

        var collectionView = CollectionViewSource.GetDefaultView(this.Files);

        Keyword.TextChanged += (s, e) =>
        {
            if (Keyword.Text == "")
            {
                collectionView.Refresh();
                return;
            }
            
            collectionView.Filter = x =>
            {
                var FilesItem = (FilesItem)x;
                return FilesItem.Name.Contains(Keyword.Text);
            };
        };

        DataContext = this;
    }
}

実行

検索窓に「本」と入力

名前に本が含む行のみ絞り込まれる。

感想

一応希望通りに動いてはいますが、Filterの使い方がこれであっているのか不安

コメント