2016-07-10 17 views
0

私のタイトルがあまりにも誤解を招くことはないが、簡単な説明が得られれば幸いです。 タイトル欄でWPFを使用しているので、リストボックスのItemsourcesをObservableCollectionに設定しました。また、値を正しく表示するためにDataTemplateを作成しました。しかし、私の問題は、ObservableCollectionの値を変更するとリストボックスに表示されないということです。 質問は今、私は間違って何をしていますか?Itemsourcesオブジェクトが変更されないListbox(C#WPF)

public ObservableCollection<Employee> employees; 
employees = DatabaseControl.GetEmployees(); 
Employee_ComboBox.ItemsSource = employees; 

そして、全体コレクションアウト切り替えイム:HERESにコード

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

しかしこのdoesntのは、それが必要として動作するように思われます。だから私はここで間違って何をしていますか? GetEmpoyees()はObservableCollectionを返します。

答えて

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とプロパティObservableCollection<Employee> {get; private set;}を使用してViewModelを使用し、それらのビューにバインドすることを検討してください。

+0

従業員数は非常に少ないので、私はあなたのソリューションを使いました。どちらが私のために素晴らしい仕事をしているのですか?ありがとうございました。 – Patrick

0

employeesのコレクションが同じ場合、コンボボックスには変更が表示されません。したがって、最初の項目ソースにnullを割り当てる:

Employee_ComboBox.ItemsSource = null; 
Employee_ComboBox.ItemsSource = employees; 
+0

同じコレクションであった場合、アイテムがコレクション – Liero

+0

に追加されたときにlistboxが即時に更新されるため、問題はありません。実際は同じではありません。 Imはコンボボックスの項目をピックし、そのIDを取得し、このIDでレコードの値を変更し、データベースを更新して、employeesコレクション内のすべての従業員をリロードします。しかし、コンボボックスやレコードの価値を示すテキストボックスのどちらにも、変化を示すものではありません。 – Patrick

+0

そして、値はデータベースで変更されます。 – Patrick

0

あなたはバインディングを使用していない考慮すると、あなたは試してみました:

Employee_ComboBox.InvalidateVisual(); 

を、それが役に立てば幸い!

関連する問題