WPF 刷新 CollectionView,无需显式重新创建(Refresh() 方法调用)

作者:编程家 分类: swift 时间:2025-11-22

在 WPF 中,CollectionView 是一种用于管理和显示数据集合的类。当我们需要对数据集合进行刷新时,通常需要调用 Refresh() 方法来重新创建 CollectionView 对象。然而,我们可以通过一种更简单的方式来实现 CollectionView 的刷新,而无需显式地调用 Refresh() 方法。

使用自动刷新的CollectionViewSource

WPF 提供了一个名为 CollectionViewSource 的类,它是 CollectionView 的包装类。通过使用 CollectionViewSource,我们可以实现 CollectionView 的自动刷新,无需手动调用 Refresh() 方法。下面是一个简单的示例代码,演示了如何使用 CollectionViewSource 来刷新 CollectionView:

csharp

// 创建一个数据集合

ObservableCollection data = new ObservableCollection

{

"Item 1",

"Item 2",

"Item 3"

};

// 创建一个 CollectionViewSource 对象,并将数据集合赋值给 Source 属性

CollectionViewSource collectionViewSource = new CollectionViewSource();

collectionViewSource.Source = data;

// 获取 CollectionView 对象

ICollectionView collectionView = collectionViewSource.View;

// 监听数据集合的变化

data.CollectionChanged += (sender, e) =>

{

// 在数据集合发生变化时,自动刷新 CollectionView

collectionView.Refresh();

};

// 修改数据集合中的数据

data[0] = "Updated Item 1";

在上面的示例中,我们使用 ObservableCollection 类来创建一个数据集合。然后,我们创建了一个 CollectionViewSource 对象,并将数据集合赋值给它的 Source 属性。接下来,我们通过 CollectionViewSource 的 View 属性获取了 CollectionView 对象。最后,我们通过监听数据集合的 CollectionChanged 事件,在数据发生变化时自动刷新 CollectionView。

使用CollectionViewSource的Filter属性过滤数据

除了自动刷新功能外,CollectionViewSource 还提供了一些其他有用的功能。其中一个功能是使用 Filter 属性来过滤数据。通过设置 Filter 属性,我们可以根据特定条件来筛选数据,并在 CollectionView 中显示符合条件的项。下面是一个示例代码,演示了如何使用 Filter 属性来过滤数据:

csharp

// 创建一个数据集合

ObservableCollection data = new ObservableCollection

{

"Item 1",

"Item 2",

"Item 3"

};

// 创建一个 CollectionViewSource 对象,并将数据集合赋值给 Source 属性

CollectionViewSource collectionViewSource = new CollectionViewSource();

collectionViewSource.Source = data;

// 获取 CollectionView 对象

ICollectionView collectionView = collectionViewSource.View;

// 设置过滤条件

collectionView.Filter = item => ((string)item).Contains("2");

// 修改数据集合中的数据

data[1] = "Updated Item 2";

在上面的示例中,我们通过设置 Filter 属性来过滤数据。在这个示例中,我们设置了一个过滤条件,即只显示包含 "2" 的项。当我们修改数据集合中的数据时,CollectionView 会自动根据过滤条件来更新显示的项。

通过使用 CollectionViewSource,我们可以实现 CollectionView 的自动刷新以及数据过滤功能,无需显式地调用 Refresh() 方法。这种方式简化了代码的编写,并提供了更好的可读性和可维护性。无论是刷新数据还是过滤数据,CollectionViewSource 都是一个强大的工具,可以帮助我们更好地管理和显示数据集合。

参考代码:

csharp

using System;

using System.Collections.ObjectModel;

using System.ComponentModel;

using System.Windows;

using System.Windows.Data;

namespace WpfApp

{

public partial class MainWindow : Window

{

public ObservableCollection Data { get; set; }

public CollectionViewSource CollectionViewSource { get; set; }

public MainWindow()

{

InitializeComponent();

Data = new ObservableCollection

{

"Item 1",

"Item 2",

"Item 3"

};

CollectionViewSource = new CollectionViewSource();

CollectionViewSource.Source = Data;

DataContext = this;

}

private void Button_Click(object sender, RoutedEventArgs e)

{

Data[0] = "Updated Item 1";

}

}

}

xaml

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

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

Title="WPF CollectionView Refresh" Height="450" Width="800">

以上代码创建了一个简单的 WPF 应用程序,其中包含一个 ListBox 和一个按钮。当按钮被点击时,数据集合中的第一个项将被修改,并自动刷新 CollectionView 中的数据。