更改项源对象不会更改列表框 (C# WPF)

本文关键字:WPF 对象 列表 | 更新日期: 2023-09-27 17:56:17

我希望我的标题不会太误导,但这里有一个快速解释。如标题中所述,我使用 WPF,我将列表框的项源设置为可观察集合。我还为它制作了一个数据模板来正确显示值。但是,我的问题是,当我更改可观察集合中的值时,它不会显示在列表框中。现在的问题是,我做错了什么?

这是代码:

public ObservableCollection<Employee> employees;
employees = DatabaseControl.GetEmployees();
Employee_ComboBox.ItemsSource = employees;

然后我切换出整个集合:

private void save_Employee_Click(object sender, RoutedEventArgs e)
    {
        deactivateEmployee();
        if (isnewEmployee)
        {
            DatabaseControl.AddEmployee(employee_firstName.Text, employee_lastName.Text, employee_phoneNumber.Text, employee_city.Text, employee_address.Text);
            isnewEmployee = false;
        }
        if (updateEmployee)
        {
            DatabaseControl.UpdateEmployee(((Employee)Employee_ComboBox.SelectedItem).ID, employee_firstName.Text, employee_lastName.Text, employee_phoneNumber.Text, employee_city.Text, employee_address.Text);
            updateEmployee = false;
        }
        employees = DatabaseControl.GetEmployees();
        Employee_ComboBox.ItemsSource = employees;
    }

但这似乎并没有达到应有的效果。那么我在这里做错了什么?GetEmpoyees() 返回一个 ObservableCollection btw。

更改项源对象不会更改列表框 (C# WPF)

ObservableCollection<Employee>的要点是,当您绑定到它时,UI 将在您添加/删除项目时做出反应,但是现在您正在将项目添加到另一个实例。如果你不想对设计进行太多更改,那么我建议让 DatabaseControl.GetEmployees() 返回一个 IList 并将结果放入员工ObservableCollection

一种简单的方法适用于不太多的员工,但如果有数千名员工,则可能表现不佳,方法是清除并添加所有

IList<Employee> result = DatabaseControl.GetEmployees();
employees.Clear();
foreach (Employee employee in result)
{
    employees.Add(employee);
}

恕我直言,更干净的设计是在数据库控件之外创建一个 Employee 实例,然后将其发送到 DatabaseControl 并将其添加到 Employees 集合中。

此外,您可能需要考虑使用具有ICommand Save和属性ObservableCollection<Employee> {get; private set;}的 ViewModel,并绑定到视图中的那些。

如果employees集合相同,则组合框不会看到任何更改。因此,首先将null分配给项目源:

Employee_ComboBox.ItemsSource = null;
Employee_ComboBox.ItemsSource = employees;

考虑到您没有使用绑定,您是否尝试过:

Employee_ComboBox.InvalidateVisual();

希望对您有所帮助!