You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中基于XAML与C#实现ListView行搜索及现有功能问题排查

问题根因

  • 你的listOfUsers已通过ItemsSource="{Binding AllPositions}"绑定了数据源,WPF中绑定ItemsSource后不允许直接操作Items集合,手动增删Items会被绑定逻辑覆盖,不会产生显性报错
  • 按钮绑定的ActiveFilter方法签名不符合WPF路由事件要求(按钮Click事件默认参数为object sender, RoutedEventArgs e),点击按钮时根本没有执行你写的筛选逻辑
  • 现有ActiveFilter没有实现任何筛选规则,只是清空后重新添加全量数据,即使执行也看不到筛选效果
  • 搜索框加了翻转的RenderTransform配置,输入的内容会反转,会导致匹配逻辑异常

正确实现方案

WPF官方推荐使用ICollectionView做列表筛选,不需要修改原始数据源,性能更优,也兼容MVVM模式。

第一步:修改XAML代码

  1. 移除搜索框的无效翻转配置,避免输入内容异常
  2. 保留ListView的ItemsSource绑定即可,不需要手动操作Items
<!-- 把原来的搜索框替换成这个,去掉多余的RenderTransform配置 -->
<TextBox x:Name="nameFilter" Margin="100,15,15,13" TextWrapping="Wrap" Text="" Width="186" />

第二步:修改后台C#代码

首先你需要在窗体类中保存全量的原始员工数据,从数据库加载的时候就存储下来:

// 窗体类中定义全量数据源字段,从数据库加载后赋值
private List<AppStaff> _allStaffs;
// 列表的集合视图,用于筛选
private ICollectionView _userCollectionView;

// 窗体初始化、数据库读取完成后,给集合视图赋值
private void InitUserData()
{
    // 这里替换成你实际从数据库读取员工数据的逻辑
    _allStaffs = LoadStaffsFromDB();
    _userCollectionView = CollectionViewSource.GetDefaultView(listOfUsers.ItemsSource);
}

// 修正按钮点击事件的签名,实现筛选逻辑
private void ActiveFilter(object sender, RoutedEventArgs e)
{
    if (_userCollectionView == null || _allStaffs == null) return;
    // 获取搜索框输入的关键词
    string searchKey = nameFilter.Text.Trim();
    // 设置筛选逻辑
    _userCollectionView.Filter = item =>
    {
        if (string.IsNullOrEmpty(searchKey)) return true; // 空关键词显示全部
        var staff = item as AppStaff;
        if (staff == null) return false;
        // 按姓名匹配,可根据需求扩展匹配姓、职位等字段
        return staff.Name.Contains(searchKey, StringComparison.OrdinalIgnoreCase);
    };
    // 刷新视图生效
    _userCollectionView.Refresh();
}

可选:实现匹配行高亮效果

如果需要高亮匹配的行,添加值转换器+样式即可:

  1. 先定义匹配转换器:
public class SearchMatchConverter : IValueConverter
{
    public string SearchKey { get; set; }
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is not AppStaff staff || string.IsNullOrEmpty(SearchKey)) 
            return Brushes.Transparent;
        return staff.Name.Contains(SearchKey, StringComparison.OrdinalIgnoreCase) 
            ? Brushes.LightYellow : Brushes.Transparent;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
  1. 在ListView的ItemContainerStyle中绑定背景色即可。

内容的提问来源于stack exchange,提问作者Edward Kamalov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:36:01