ObservableList ReadOny Datagrid

私は、読み取り専用の動作を模倣するために、観測可能リストの次の拡張を作成しました。

public class WeirdList : ObservableCollection
{

    public new void Add(T item)
    {
        throw new NotImplementedException("Add function not implemented.");
    }

    public new void Insert(int index, T item)
    {
        throw new NotImplementedException("Insert() not implemented.");
    }

}

しかし、これをCanUserAddRows = trueのデータグリッドにバインドすると、GUI経由でデータグリッドに行を追加すると例外がスローされますが、明らかなメソッドをオーバーライドしたにもかかわらずオブジェクトがコレクションに追加されていることがわかります追加が可能です。

コードを追加しようとすると、例外がスローされます。

どんな助け?

よろしく

2

2 答え

関数をオーバーライドしておらず、関数を再定義しただけです。 new ではなく override を使用する必要があります。グリッドはおそらくデータソースを ICollection にキャストします。つまり、あなたの関数は呼び出されません。それらはオブジェクトがあなたのタイプと完全に一致している場合にのみ使用されます。

コメント Add Insert のコメントで述べたように、代わりに InsertItem 関数をオーバーライドします。 (両方を追加して挿入すると、この関数が内部的に呼び出されます)

1
追加された
Addは仮想として宣言されていません: msdn.microsoft .com/ja-us/library/ms132404(v = vs.85).aspx
追加された 著者 Adam Rackis,
InsertItemのオーバーライドを追加しようとしましたが効果はありません。
追加された 著者 Peter,
ああ、私は正しく挿入項目をオーバーライドしませんでした。それは今働いている!
追加された 著者 Peter,
アイテムを挿入してオーバーライドし、コレクションにグリッドを使用しないアイテムを追加すると例外がスローされますか?
追加された 著者 Magnus,

addメソッドを次のように宣言しました:

public new void Add

基本クラスのバージョンをシャドウイングしています。 DataGridは、基本クラスの Add メソッドを使用している可能性があります。

あなたのグリッドが次のようになるリストを宣言しているなら

ObservableCollection Src = new WeirdList...

次にそれに変更してください

WeirdList Src = new WeirdList...

Since the Add method in ObservableCollection is not declared as virtual, and therefore cannot be overridden.

それがうまくいかなければ、それはグリッドがあなたのコレクションをキャストしていることを意味し、それによって不可能なことを不可能にすることをあなたの苦労から取り除きます。

0
追加された
あなたが正常に変更した他のメソッドは、ObservableCollection で仮想として宣言されていますか?
追加された 著者 Adam Rackis,
WeirdCollectionに他の関数を追加しました。いくつかのイベントは正常に呼び出されるようです。私は、DataGridがICollectionとしてキャストされる方法を理解していませんが、私の他の関数/イベントはまだ動作状態に残っています。
追加された 著者 Peter,