如何使ItemsSource不被使用?

时间:2012-08-13 17:32:18

标签: c# wpf data-binding

我在WPF中有一个DataGrid(一个扩展DataGrid的类),我想编辑它中的项目。但当然我收到以下错误:

Operation is not valid while ItemsSource is in use. 
Access and modify elements with ItemsControl.ItemsSource instead.

我已经尝试更改DataGrid的itemsSource,然后添加项目,但我仍然得到相同的错误。类似的东西:

public class MyDG:DataGrid{

    public void add(){
        List<TimesheetRecord> records = new List<TimesheetRecord>();

        foreach(TimesheetRecord rec in this.Items){
            records.Add(rec);
        }

        //DO SOME STUFF, ADD MORE ITEMS TO records

        ItemCollection col = this.Items;
        this.ItemsSource = records;
        col.Clear();

       foreach(TimesheetRecord rec in records){
            col.add(red);//exception thrown here
        }

        this.ItemsSource = col;
    }

}

当我已将itemsSource更改为其他列表时,我不明白为什么会收到该错误?

我不能(轻松地)将项目添加到最初绑定为itemsSource的列表中,因为该列表存在于不同的类中。我最好在MyDG类中有一个List<TimesheetRecord> myItems = new List<TimesheetRecord>();的全局变量,然后在MyDG的构造函数中this.ItemsSource = myItems

或者您有什么其他建议我应该怎么做呢?我对任何事情持开放态度,因为这是我第一次使用数据绑定,所以我可能做错了...

3 个答案:

答案 0 :(得分:4)

Decalre将收集记录为:

ObservableCollection<TimesheetRecord> records = new ObservableCollection<TimesheetRecord>();

并将其数据绑定到DataGrid。根据需要处理记录集合,数据绑定将保持UI与集合同步。

答案 1 :(得分:2)

您必须选择是否使用 Items ItemsSource ,您不能互相使用。使用 ItemsSource 时尝试修改 Items 会假定不支持隐式转换,因此会出错。

在这种情况下,似乎最好的方法可能是设置 Items 并直接添加到该集合。要使用 ItemsSource ,您需要完全按照自己的意愿传递对 ItemsSource 集合( List&lt; TimesheetRecord&gt; )的引用到您的 DataGrid 类。

答案 2 :(得分:1)

将“记录”分配给ItemsSource后,您已经更新了集合。无需手动将项添加到dataGrid.Items集合。