WPF 数据网格:以简单的方式更新项源

本文关键字:方式 更新 简单 数据 数据网 网格 WPF | 更新日期: 2023-09-27 17:57:07

首先,我通常使用 MVVM 或 MVVMC 编写代码,但对于一个非常简单的项目,我想尝试用"旧方式"做所有事情,这意味着编写一个简单易懂的应用程序,只使用逻辑背后的代码,没有 INotifyPropertyChanged 接口。

为此,我创建了一个非常简单的员工示例应用程序,其中包含一个将员工列表加载到 Obersvablecolletion 的类。问题是:在我设置了 Itemssource 和 DataContext 之后,在加载之后,我的 DataGrid 没有得到更新。当然,我可以在加载后再次设置数据上下文,但是有更好的方法吗?某种在代码后面告诉 DataGrid 它的内容已经更改并对其进行验证?

这是我的示例代码:

public partial class MainWindow : Window
{
    private EmployeeList _MyList;
    public MainWindow()
    {
        InitializeComponent();
         _MyList= new EmployeeList();            
         _MyList.Employees = new ObservableCollection<Employee>();                        
        _MyGrid.DataContext = _MyList;
        _MyGrid.ItemsSource = _MyList.Employees;
    }
    private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    }
    private void _AddButton_Click(object sender, RoutedEventArgs e)
    {
        AddWindow newWindow = new AddWindow();
        if (newWindow.ShowDialog() == true)
        {
            _MyList.Employees.Add(newWindow.NewEmployee);
        }
    }
    private void _LoadButton_Click(object sender, RoutedEventArgs e)
    {
        _MyList.Load();            
        //Creates new_MyList.Employees and fills with content from a file. After that, my DataGrid does not get updated
    }

WPF 数据网格:以简单的方式更新项源

不要创建新的_MyList.Employees集合实例。

而是清除并重新填充现有的:

_MyList.Employees.Clear();
for (var employee in employeesFromFile)
{
    _MyList.Employees.Add(employee);
}

由于您没有对_MyGrid.ItemsSource使用绑定,因此也无需设置_MyGrid.DataContext

如果您使用的是ObservableCollection,那么DataGrid将自行更新,没有任何额外的问题。

但是如果你使用的是List<Employee>,那么你需要重新分配ItemsSource,如下所示:

private void _AddButton_Click(object sender, RoutedEventArgs e)
    {
        AddWindow newWindow = new AddWindow();
        if (newWindow.ShowDialog() == true)
        {
            _MyList.Employees.Add(newWindow.NewEmployee);
            // re-assign the `ItemsSource`
            _MyGrid.ItemsSource = null;
            _MyGrid.ItemsSource = _MyList.Employees;
        }
    }
您可以通过为

数据网格分配 null 值来删除现有的项源,然后分配更新的项源,例如,

_MyGrid.ItemsSource = null;
_MyGrid.ItemsSource = _MyList.Employees;