更改项源对象不会更改列表框 (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。
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();
希望对您有所帮助!