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);
}

よりクリーンな設計の IMHO は、代わりに Employee インスタンスを DatabaseControl の外に作成し、それを DatabaseControl に送信して、それを employees コレクションに追加することです。

また、ViewModel をICommand Saveおよび プロパティとともに使用ObservableCollection<Employee> {get; private set;}し、ビューからそれらにバインドすることを検討することもできます。

于 2016-07-10T18:44:58.107 に答える
0

バインディングを使用していないことを考慮して、試しましたか:

Employee_ComboBox.InvalidateVisual();

それが役に立てば幸い!

于 2016-07-10T17:41:40.537 に答える
0

コレクションが同じである場合employees、コンボボックスには何の変化も見られません。したがって、最初にnull項目ソースに割り当てます。

Employee_ComboBox.ItemsSource = null;
Employee_ComboBox.ItemsSource = employees;
于 2016-07-10T17:02:11.307 に答える