【问题标题】:Changing Itemsources Object doesnt change Listbox (C# WPF)更改 Itemssource 对象不会更改列表框(C# WPF)
【发布时间】:2016-07-10 16:55:32
【问题描述】:

我希望我的标题不会太误导,但这里有一个简单的解释。 正如我在使用 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。

【问题讨论】:

    标签: c# wpf listbox itemsource


    【解决方案1】:

    ObservableCollection&lt;Employee&gt; 的要点是,当您绑定到它时,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 和属性 ObservableCollection&lt;Employee&gt; {get; private set;} 的 ViewModel 并绑定到您视图中的那些。

    【讨论】:

    • 员工很少,所以我使用了您的解决方案。这对我来说很好。谢谢。
    【解决方案2】:

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

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

    【讨论】:

    • 这不是问题,因为如果它是同一个集合,列表框将在项目添加到集合时立即更新
    • 其实不太一样。我选择组合框的一个项目,获取它的 id,用这个 id 更改记录的值,更新数据库,然后重新加载员工集合中的所有员工。但它没有显示更改,无论是在组合框中还是在显示记录值的文本框中。
    • 是的,数据库中的值发生了变化。
    • 我不知道DatabaseControl 是什么,但它可以返回缓存条目而不是从数据库重新加载吗?
    【解决方案3】:

    考虑到你没有使用绑定,你试过了吗:

    Employee_ComboBox.InvalidateVisual();
    

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2014-01-26
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多