替换 ObservableCollection 后刷新 WPF 数据视图

本文关键字:数据 视图 WPF 刷新 ObservableCollection 替换 | 更新日期: 2023-09-27 18:35:51

我有 3 个返回 List 集合的方法,我无法更改它们。

    List<Person> GetListPerson()
    {
        List <Person> list = new List<Person>();
        list.Add(new Person { FirstName = "Judge", LastName = "Mental" });
        list.Add(new Person { FirstName = "Office", LastName = "Rocker" });
        list.Add(new Person { FirstName = "Sir", LastName = "Real" });
        return list;
    }
    List<Person> GetOnePerson()
    {
        List<Person> list = new List<Person>();
        list.Add(new Person { FirstName = "Josh", LastName = "Smith" });
        return list;
    }
    List<Person> ClearPerson()
    {
        List<Person> list = new List<Person>();
        return list;
    }

在我的 XAML 中,我有一个 3 个按钮和一个绑定到可观察集合的网格

<Window x:Class="WpfApplication.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <Button Name="GetList" Height="30" Content="GetList" Click="GetList_Click"  />
    <Button Name="GetOne" Height="30"  Content="GetOne" Click="GetOne_Click"/>
    <Button Name="Clear" Height="30" Content="Clear" Click="Clear_Click" />
    <DataGrid x:Name="dataGrid" Height="230" ItemsSource="{Binding}" />
</StackPanel>

这是背后的代码:

private ObservableCollection<Person> _pObsList;
    public ObservableCollection<Person> PObsList
    {
        get { return _pObsList; }
        set { _pObsList = value;
            this.OnPropertyChanged("PObsList");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(
                this, new PropertyChangedEventArgs(propName));
    }
    public MainWindow()
    {
        InitializeComponent();
        PObsList = new ObservableCollection<Person>();
        dataGrid.DataContext = PObsList;
    }

    private void GetList_Click(object sender, RoutedEventArgs e)
    {
        PObsList = new ObservableCollection<Person>(GetListPerson());
    }
    private void GetOne_Click(object sender, RoutedEventArgs e)
    {
        PObsList = new ObservableCollection<Person>(GetOnePerson());
    }
    private void Clear_Click(object sender, RoutedEventArgs e)
    {
        PObsList = new ObservableCollection<Person>(ClearPerson());
    }

当应用程序运行时,网格将按预期显示列,但没有记录;但如果单击GetList按钮,我的Observable集合将包含3个元素,但DataGrid将保持为空。

通过阅读其他链接,似乎我需要在集合上实现 PropertyChanged,但我认为缺少其他内容。

无法将

列表更改为可观察集合,我试图不手动清除和添加它们。

有什么想法或帮助吗?

替换 ObservableCollection 后刷新 WPF 数据视图

我认为问题是DataContext.当您更改 3 个事件处理程序中的任何一个中的PObsList时,您只需为 PObsList 设置一个新值,DataContext将保持原始PObsList。我建议使用一个单独的对象(视图模型)和一个ObservableCollection属性用作DataContext,而不是直接使用ObservableCollection

在单击处理程序中,您可以覆盖PObsList变量。清除列表并从以下方法添加新项:

PObsList.Clear();
PObsList.AddRange(GetListPerson());

如果你在

public MainWindow()
{
    InitializeComponent();
    PObsList = new ObservableCollection<Person>();
    dataGrid.DataContext = PObsList;
}

你会看到 PObsList 是空的。

当您按 GetList 按钮时,您的列表不为空,因为您的方法 GetListPerson 返回一个包含值的列表。

您可以更改为 :

 public MainWindow()
    {
        InitializeComponent();
        PObsList = new ObservableCollection<Person>();
        PObsList.AddRange(GetPersonList());
        dataGrid.DataContext = PObsList;
    }