Wpf Observable 集合和 DataGrid 不更新更改

swift

1个回答

写回答

wjf0422

2025-09-06 23:10

+ 关注

AI
AI

如何使用 WPF Observable 集合和 DataGrid 实现数据更改的自动更新

在 WPF 应用程序中,我们经常需要将数据显示在一个表格中,而 DataGrid 是一个常用的控件用于显示和编辑数据。然而,当我们使用 Observable 集合来绑定 DataGrid 的数据源时,有时候会遇到一个问题:当集合中的数据发生更改时,DataGrid 并不会自动更新。本文将介绍如何解决这个问题并实现数据更改的自动更新。

问题描述

首先让我们看一下具体的问题。假设我们有一个包含学生信息的 Observable 集合,我们希望将这些学生信息显示在一个 DataGrid 中。我们使用如下的代码来绑定数据:

ObservableCollection<Student> students = new ObservableCollection<Student>();

dataGrid.ItemsSource = students;

然后,我们在代码的其他地方对学生信息进行了更改,比如添加了一个新的学生:

students.Add(new Student("John", 20));

然而,当我们运行程序时,发现 DataGrid 并没有显示新添加的学生信息。这是因为 Observable 集合的更改并不会自动触发 DataGrid 的刷新。

解决方案

要解决这个问题,我们需要在 Observable 集合的数据更改时手动触发 DataGrid 的刷新。幸运的是,WPF 提供了一个事件叫做 CollectionChanged,它会在 Observable 集合的数据更改时触发。我们可以通过订阅这个事件来实现自动更新。

首先,在初始化 Observable 集合后,我们需要为 CollectionChanged 事件添加一个处理函数,如下所示:

students.CollectionChanged += Students_CollectionChanged;

然后,在处理函数中,我们可以调用 DataGrid 的 Refresh 方法来手动刷新数据,代码如下:

private void Students_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)

{

dataGrid.Items.Refresh();

}

以上代码中的 dataGrid 是我们在 XAML 中定义的 DataGrid 控件的名称。

案例代码

下面是一个完整的示例代码,演示了如何使用 Observable 集合和 DataGrid 实现数据更改的自动更新。

XAML 代码:

<Window x:Class="WpfDataGridUpdate.MAInWindow"</p> XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

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

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

<Grid>

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False">

<DataGrid.Columns>

<DataGridTextColumn Header="Name" Binding="{Binding Name}" />

<DataGridTextColumn Header="Age" Binding="{Binding Age}" />

</DataGrid.Columns>

</DataGrid>

</Grid>

</Window>

C# 代码:

using System.Collections.ObjectModel;

using System.Collections.Specialized;

using System.Windows;

namespace WpfDataGridUpdate

{

public partial class MAInWindow : Window

{

ObservableCollection<Student> students;

public MAInWindow()

{

InitializeComponent();

students = new ObservableCollection<Student>();

students.CollectionChanged += Students_CollectionChanged;

dataGrid.ItemsSource = students;

students.Add(new Student("John", 20));

}

private void Students_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)

{

dataGrid.Items.Refresh();

}

}

public class Student

{

public string Name { get; set; }

public int Age { get; set; }

public Student(string name, int age)

{

Name = name;

Age = age;

}

}

}

在上面的示例代码中,我们创建了一个名为 Student 的简单数据模型,包含 Name 和 Age 两个属性。然后,我们在 MAInWindow 的构造函数中初始化 Observable 集合并添加了一个学生信息。最后,在处理 CollectionChanged 事件的函数中调用了 DataGrid 的 Refresh 方法来实现自动更新。

通过订阅 Observable 集合的 CollectionChanged 事件以及手动调用 DataGrid 的 Refresh 方法,我们可以实现数据更改的自动更新。这样,当我们在 Observable 集合中添加、删除或修改数据时,DataGrid 将会自动更新显示最新的数据。希望本文对你在使用 WPF Observable 集合和 DataGrid 实现数据自动更新方面有所帮助。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号