0

我希望我的标题不会太误导,但这里有一个快速的解释。正如我在使用 WPF 的标题中提到的,我将 Listbox 的 Itemsources 设置为 ObservableCollection。我还为它制作了一个 DataTemplate 以正确显示值。但是我的问题是,当我更改 ObservableCollection 中的值时,它不会显示在列表框中。现在的问题是,我做错了什么?

继承人的代码:

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。

4

3 回答 3

1

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

一个简单的方法适用于不是太多的员工,但如果你有成千上万的员工可能会表现不佳,那就是清除并添加所有

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

恕我直言,更简洁的设计是在 DatabaseControl 之外创建一个 Employee 实例,然后将其发送到 DatabaseControl 并将其添加到 employees 集合中。

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

于 2016-07-10T18:44:58.107 回答
0

如果employees集合相同,那么组合框将看不到任何变化。因此首先分配null给项目来源:

Employee_ComboBox.ItemsSource = null;
Employee_ComboBox.ItemsSource = employees;
于 2016-07-10T17:02:11.307 回答
0

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

Employee_ComboBox.InvalidateVisual();

希望能帮助到你!

于 2016-07-10T17:41:40.537 回答