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の使い方がこれであっているのか不安
コメント