更改 Itemssource Object 不会更改列表框 (C# WPF)
Changing Itemsources Object doesnt change Listbox (C# WPF)
我希望我的标题不会太误导人,但这里有一个快速的解释。
正如标题中提到的,我使用 WPF 并将列表框的 Itemsources 设置为 ObservableCollection。我还为它制作了一个 DataTemplate 以正确显示值。但是我的问题是,当我更改 ObservableCollection 中的值时,它不会显示在列表框中。
现在的问题是,我做错了什么?
代码如下:
public ObservableCollection<Employee> employees;
employees = DatabaseControl.GetEmployees();
Employee_ComboBox.ItemsSource = employees;
然后我把整个关掉Collection:
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() returns 一个 ObservableCollection 顺便说一句。
如果employees
集合相同,则组合框不会发生任何变化。因此,首先将 null
分配给项目来源:
Employee_ComboBox.ItemsSource = null;
Employee_ComboBox.ItemsSource = employees;
考虑到您没有使用绑定,您是否尝试过:
Employee_ComboBox.InvalidateVisual();
希望对您有所帮助!
ObservableCollection<Employee>
的要点是,当您绑定到它时,UI 将在您从它 add/remove 项时做出反应,
但现在您正在将项目添加到另一个实例。
如果您不想过多更改设计,那么我建议使用 DatabaseControl.GetEmployees() return 一个 IList 并将结果放入 employees ObservableCollection
一个简单的方法适用于不太多的员工,但如果您有数千名员工则可能表现不佳,那就是清除并添加所有
IList<Employee> result = DatabaseControl.GetEmployees();
employees.Clear();
foreach (Employee employee in result)
{
employees.Add(employee);
}
恕我直言,更简洁的设计是在 DatabaseControl 之外创建一个 Employee 实例,然后将其发送到 DatabaseControl 并将其添加到 employees 集合。
此外 - 您可能需要考虑使用带有 ICommand Save
和 属性 ObservableCollection<Employee> {get; private set;}
的 ViewModel 并绑定到您的视图。
我希望我的标题不会太误导人,但这里有一个快速的解释。 正如标题中提到的,我使用 WPF 并将列表框的 Itemsources 设置为 ObservableCollection。我还为它制作了一个 DataTemplate 以正确显示值。但是我的问题是,当我更改 ObservableCollection 中的值时,它不会显示在列表框中。 现在的问题是,我做错了什么?
代码如下:
public ObservableCollection<Employee> employees;
employees = DatabaseControl.GetEmployees();
Employee_ComboBox.ItemsSource = employees;
然后我把整个关掉Collection:
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() returns 一个 ObservableCollection 顺便说一句。
如果employees
集合相同,则组合框不会发生任何变化。因此,首先将 null
分配给项目来源:
Employee_ComboBox.ItemsSource = null;
Employee_ComboBox.ItemsSource = employees;
考虑到您没有使用绑定,您是否尝试过:
Employee_ComboBox.InvalidateVisual();
希望对您有所帮助!
ObservableCollection<Employee>
的要点是,当您绑定到它时,UI 将在您从它 add/remove 项时做出反应,
但现在您正在将项目添加到另一个实例。
如果您不想过多更改设计,那么我建议使用 DatabaseControl.GetEmployees() return 一个 IList 并将结果放入 employees ObservableCollection
一个简单的方法适用于不太多的员工,但如果您有数千名员工则可能表现不佳,那就是清除并添加所有
IList<Employee> result = DatabaseControl.GetEmployees();
employees.Clear();
foreach (Employee employee in result)
{
employees.Add(employee);
}
恕我直言,更简洁的设计是在 DatabaseControl 之外创建一个 Employee 实例,然后将其发送到 DatabaseControl 并将其添加到 employees 集合。
此外 - 您可能需要考虑使用带有 ICommand Save
和 属性 ObservableCollection<Employee> {get; private set;}
的 ViewModel 并绑定到您的视图。