1

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 goのコンストラクターに入れるのが最善でしょうか?this.ItemsSource = myItems

または、これを行うにはどうすればよいか、他に何か提案はありますか? データバインディングを使用したのはこれが初めてなので、私は何に対してもオープンです。おそらく何か間違ったことをしているのでしょう...

4

3 に答える 3

4

デカレはコレクションを次のように記録します:

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

DataGrid にデータをバインドしたままにします。必要に応じてレコード コレクションを操作します。データ バインディングは、UI をコレクションと同期させます。

于 2012-08-13T17:42:25.643 に答える
2

ItemsItemsSourceのどちらを使用するかを選択する必要があります。両方を交互に使用することはできません。ItemsSourceの使用中にアイテムを変更しようとすると、サポートされていない暗黙的な変換が想定されるため、エラーが発生します。

この場合、 Itemsを設定してそのコレクションに直接追加するのが最善の方法のようです。ItemsSourceを使用するには、まさにあなたが書いたように、ItemsSourceコレクション ( List<TimesheetRecord> )への参照をDataGridクラスに渡す必要があります。

于 2012-08-13T17:44:43.453 に答える
1

「レコード」を ItemsSource に割り当てると、コレクションは既に更新されています。dataGrid.Items コレクションに項目を手動で追加する必要はありません。

于 2012-08-13T17:42:12.033 に答える