WPF DataGrid 过滤 - CollectionViewSource 刷新

作者:编程家 分类: swift 时间:2025-06-10

使用 WPF DataGrid 进行数据展示和过滤是非常常见的需求。在实际开发中,我们经常需要根据用户的输入来动态地过滤数据,并在用户改变过滤条件时及时刷新展示的结果。本文将介绍如何使用 CollectionViewSource 来实现 WPF DataGrid 的过滤功能,并通过一个案例代码来进行演示。

CollectionViewSource 是 WPF 中用于对集合进行排序、过滤和分组的类。它提供了一个 View 属性,可以绑定到 DataGrid 的 ItemsSource 属性上,从而实现对数据的过滤和排序。在我们的案例中,我们将使用一个简单的学生信息列表来进行演示。

首先,我们需要在 XAML 中定义一个 CollectionViewSource,并将其绑定到 DataGrid 的 ItemsSource 属性上。假设我们的学生信息列表是一个名为 Students 的 ObservableCollection,我们可以这样定义 CollectionViewSource:

xaml

然后,我们将 CollectionViewSource 的 View 属性绑定到 DataGrid 的 ItemsSource 属性上:

xaml

接下来,我们需要在代码中处理用户的输入,并根据输入来更新 CollectionViewSource 的过滤条件。我们可以使用 CollectionViewSource 的 Filter 事件来实现这个功能。假设我们有一个名为 FilterText 的属性,用于存储用户输入的过滤条件,我们可以这样处理 Filter 事件:

csharp

private void OnFilter(object sender, FilterEventArgs e)

{

Student student = e.Item as Student;

if (student != null)

{

if (string.IsNullOrEmpty(FilterText))

{

e.Accepted = true;

}

else

{

if (student.Name.Contains(FilterText))

{

e.Accepted = true;

}

else

{

e.Accepted = false;

}

}

}

}

在这个事件处理程序中,我们首先将当前项转换为 Student 对象,然后根据 FilterText 的值来判断该项是否符合过滤条件。如果 FilterText 为空或者学生的姓名包含 FilterText,则接受该项,否则不接受。

最后,我们需要在代码中订阅 CollectionViewSource 的 Filter 事件,并在用户输入改变时刷新视图:

csharp

private void OnFilterTextChanged(object sender, TextChangedEventArgs e)

{

CollectionViewSource.GetDefaultView(Students).Refresh();

}

在这个事件处理程序中,我们调用 CollectionViewSource 的 Refresh 方法来刷新视图,从而触发 Filter 事件,根据新的过滤条件重新过滤数据并显示结果。

通过以上步骤,我们就实现了使用 CollectionViewSource 来刷新 WPF DataGrid 的过滤功能。当用户输入改变时,DataGrid 会自动更新展示的结果。这种方式非常灵活,可以根据实际需求来自定义过滤条件,实现更复杂的过滤功能。

案例代码:

下面是一个完整的示例代码,演示了如何使用 CollectionViewSource 来刷新 WPF DataGrid 的过滤功能:

xaml

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="MainWindow" Height="450" Width="800">

csharp

using System.Collections.ObjectModel;

using System.ComponentModel;

using System.Windows;

namespace WpfApp

{

public partial class MainWindow : Window, INotifyPropertyChanged

{

public event PropertyChangedEventHandler PropertyChanged;

private ObservableCollection _students;

private string _filterText;

public ObservableCollection Students

{

get { return _students; }

set

{

_students = value;

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Students)));

}

}

public string FilterText

{

get { return _filterText; }

set

{

_filterText = value;

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(FilterText)));

}

}

public MainWindow()

{

InitializeComponent();

Students = new ObservableCollection

{

new Student { Name = "Alice" },

new Student { Name = "Bob" },

new Student { Name = "Charlie" },

new Student { Name = "David" },

new Student { Name = "Emily" }

};

CollectionViewSource.GetDefaultView(Students).Filter += OnFilter;

}

private void OnFilter(object sender, FilterEventArgs e)

{

Student student = e.Item as Student;

if (student != null)

{

if (string.IsNullOrEmpty(FilterText))

{

e.Accepted = true;

}

else

{

if (student.Name.Contains(FilterText))

{

e.Accepted = true;

}

else

{

e.Accepted = false;

}

}

}

}

private void OnFilterTextChanged(object sender, TextChangedEventArgs e)

{

CollectionViewSource.GetDefaultView(Students).Refresh();

}

}

public class Student

{

public string Name { get; set; }

}

}

在这个示例中,我们创建了一个简单的 WPF 窗口,并在其中定义了一个 DataGrid,用于展示学生信息。我们通过 CollectionViewSource 将学生信息列表绑定到 DataGrid 的 ItemsSource 上,并在代码中订阅了 CollectionViewSource 的 Filter 事件。当用户输入改变时,我们调用 CollectionViewSource 的 Refresh 方法来刷新视图,从而实现了动态过滤的功能。

本文介绍了如何使用 CollectionViewSource 来实现 WPF DataGrid 的过滤功能。通过订阅 CollectionViewSource 的 Filter 事件,并根据用户的输入来更新过滤条件,我们可以实现动态过滤数据并在 DataGrid 中展示结果。这种方式非常灵活,可以适应不同的过滤需求。

通过以上的案例代码,我们可以快速上手并实现 WPF DataGrid 的过滤功能。希望本文能对你有所帮助!