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

如何在WPF ListView中筛选并显示两个选定日期之间的条目?

日期范围筛选ListView的实现方案

一、控件选择建议

优先用DatePicker控件,原因:

  • 既支持可视化选择日期,也允许手动输入,兼顾易用性和灵活性
  • 相比ComboBox罗列所有日期,不会因数据量过大导致界面拥挤,更适合任意日期范围的选择

二、修改XAML添加日期筛选控件

在ListView上方添加两个DatePicker和一个筛选按钮,绑定到后台属性:

<!-- 日期筛选区域 -->
<StackPanel Orientation="Horizontal" Margin="66,20,0,0" Height="30">
    <Label Content="开始日期:" VerticalAlignment="Center"/>
    <DatePicker SelectedDate="{Binding StartDate, Mode=TwoWay}" Width="120" Margin="5,0"/>
    <Label Content="结束日期:" VerticalAlignment="Center" Margin="10,0"/>
    <DatePicker SelectedDate="{Binding EndDate, Mode=TwoWay}" Width="120" Margin="5,0"/>
    <Button Content="筛选" Command="{Binding FilterCommand}" Margin="15,0"/>
</StackPanel>

<!-- 原ListView修改ItemsSource绑定到视图集合 -->
<ListView HorizontalAlignment="Left" Height="360" Margin="66,55,0,0" 
          VerticalAlignment="Top" Width="623" ItemsSource="{Binding COSPVMView}">
    <ListView.View>
        <GridView x:Name="GridView1">
            <GridViewColumn Header="Time Stamp" DisplayMemberBinding="{Binding Path=TimeStamp}"/>
            <GridViewColumn Header="COSP %" DisplayMemberBinding="{Binding Path=COSP}"/>
        </GridView>
    </ListView.View>
</ListView>

三、后台ViewModel实现(MVVM模式,推荐WPF新手使用)

创建ViewModel类,实现INotifyPropertyChanged接口,处理数据绑定和筛选逻辑:

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Data;
using System.Windows.Input;

public class MainViewModel : INotifyPropertyChanged
{
    // 原始数据集合
    public ObservableCollection<COSPVMItem> COSPVM { get; set; }
    // 用于筛选的视图集合
    public ICollectionView COSPVMView { get; set; }

    private DateTime? _startDate;
    public DateTime? StartDate
    {
        get => _startDate;
        set
        {
            _startDate = value;
            OnPropertyChanged(nameof(StartDate));
        }
    }

    private DateTime? _endDate;
    public DateTime? EndDate
    {
        get => _endDate;
        set
        {
            _endDate = value;
            OnPropertyChanged(nameof(EndDate));
        }
    }

    // 筛选命令
    public ICommand FilterCommand { get; }

    public MainViewModel()
    {
        // 模拟初始化数据,实际替换为你的数据源
        COSPVM = new ObservableCollection<COSPVMItem>
        {
            new COSPVMItem { TimeStamp = DateTime.Now.AddDays(-5), COSP = 75.2 },
            new COSPVMItem { TimeStamp = DateTime.Now.AddDays(-3), COSP = 82.1 },
            new COSPVMItem { TimeStamp = DateTime.Now.AddDays(-1), COSP = 78.5 },
            new COSPVMItem { TimeStamp = DateTime.Now, COSP = 80.3 }
        };

        // 创建视图集合并关联原始数据
        COSPVMView = CollectionViewSource.GetDefaultView(COSPVM);
        // 初始化筛选命令
        FilterCommand = new RelayCommand(ExecuteFilter);
    }

    private void ExecuteFilter()
    {
        // 设置筛选逻辑
        COSPVMView.Filter = item =>
        {
            var cosItem = item as COSPVMItem;
            if (cosItem == null) return false;

            // 处理日期为空的情况:未选开始日期则默认从最早日期开始,未选结束日期则默认到最晚日期
            var start = StartDate ?? DateTime.MinValue;
            var end = EndDate ?? DateTime.MaxValue;

            return cosItem.TimeStamp >= start && cosItem.TimeStamp <= end;
        };
        // 强制刷新视图
        COSPVMView.Refresh();
    }

    // 实现INotifyPropertyChanged接口
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

// 你的COSPVM数据模型类(示例)
public class COSPVMItem
{
    public DateTime TimeStamp { get; set; }
    public double COSP { get; set; }
}

// 简易RelayCommand实现(用于绑定按钮命令)
public class RelayCommand : ICommand
{
    private readonly Action _execute;
    private readonly Func<bool> _canExecute;

    public event EventHandler CanExecuteChanged;

    public RelayCommand(Action execute, Func<bool> canExecute = null)
    {
        _execute = execute ?? throw new ArgumentNullException(nameof(execute));
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter) => _canExecute?.Invoke() ?? true;

    public void Execute(object parameter) => _execute();

    public void RaiseCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}

四、关联ViewModel到视图

在窗口的构造函数中设置DataContext:

public MainWindow()
{
    InitializeComponent();
    DataContext = new MainViewModel();
}

五、关键逻辑说明

  1. ICollectionView的作用:它是WPF中专门用于数据筛选、排序、分组的视图层,绑定到ListView后,筛选操作会自动更新UI,无需手动刷新ListView
  2. Filter委托:通过判断每个数据项的TimeStamp是否在选定的日期范围内,返回true则保留该条目,false则隐藏
  3. 空日期处理:如果用户未选择开始/结束日期,默认用DateTime.MinValue/DateTime.MaxValue,表示无限制筛选范围

内容的提问来源于stack exchange,提问作者Nikolai 'Møller'

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:30:39