foreach
ループ中にObservableCollection
のアイテムを更新する際に問題が発生しています。基本的に私はObservableCollection
の従業員を抱えています。彼らは建物内にいるかどうかを決定するフィールドをモデルに持っています。Foreachループでのコレクションの変更C#
私はこの状態に変化があるかどうかをすべての従業員をチェックするために常にデータベーステーブルを調べています。これは私がC#
でこれを行う方法です。
public ObservableCollection<EmployeeModel> EmployeesInBuilding {get; set; }
public ObservableCollection<EmployeeModel> Employees {get; set; }
var _employeeDataService = new EmployeeDataService();
EmployeesInBuilding = _employeeDataService.GetEmployeesInBuilding();
foreach (EmployeeModel empBuild in EmployeesInBuilding)
{
foreach (EmployeeModel emp in Employees)
{
if (empBuild.ID == emp.ID)
{
if (empBuild.InBuilding != emp.InBuilding)
{
emp.InBuilding = empBuild.InBuilding;
int j = Employees.IndexOf(emp);
Employees[j] = emp;
employeesDataGrid.Items.Refresh();
}
}
}
}
これは正しく、私は既存のObservableCollection
を更新するために行くときしかし、私は例外を取得、2 ObseravbleCollections
間の変化をピックアップ:Collection was modified; enumeration operation may not execute.
は、どのように私はこれを防ぐ、まだ元のコレクションを変更することができます?
インデックス位置 'j'の' Employees'に 'emp'がすでに含まれている場合、' Employees [j] = emp'を呼び出すのは意味がありません。コレクション要素を置き換える代わりに、 'InBuilding'プロパティが変更されたときにEmployeeModelクラスに' INotifyPropertyChanged'インタフェースを実装させ、 'PropertyChanged'イベントを発生させるべきです。 – Clemens
私はこの部分について疑いがあります。 'int j = Employees.IndexOf(emp);従業員[j] = emp; '。 'j'インデックスの要素は変更されません。 'foreach(EmployeeModel emp in Employees)'の代わりに 'for'ループを使うと、あなたのコードは例外なく動作します。 – ASh