0

IBindingList を実装するカスタム コレクションを作成して、サード パーティのカスタム コントロールにバインドできるようにする必要があります。私が抱えているもう 1 つの問題は、複数のスレッドからアイテムを同時に手動で挿入するため、そのコレクションをスレッド セーフにしなければならないことです。

とにかくBindingList<T>、車輪をあまり再発明しないために、クラスのフィールドとして a を使用しています。したがって、私のクラスは次のようになります。

class ThreadSaveBindingCollection<T> : IEnumerable<T>, IBindingList
{
    BindingList<T> collection;
    object _lock = new object();

    // constructors
    public ThreadSaveBindingCollection(IEnumerable<T> initialCollection)
    {
        if (initialCollection == null)
            collection = new BindingList<T>();
        else                            
            collection = new BindingList<T>(new List<T>(initialCollection));                                 
    }
    public ThreadSaveBindingCollection() : this(null)
    {            
    }   

    // Todo: Implement interfaces using collection to do the work    
}

インターフェイス IEnumerable と IBinding リストを実装していないことに注意してください。それらのインターフェースも実装しているので、フィールドがそれを処理することを計画してcollectionいます。したがって、Visual Studio にインターフェイスを明示的に実装させthrow new NotImplementedException()、フィールドのcollection実装に置き換えると、次のようになります。

ここに画像の説明を入力

今問題は

コレクションが IBindingList の実装を主張している場合、フィールド コレクションでメソッド AddIndex を呼び出せないのはなぜですか?

ここに画像の説明を入力

いくつかの方法で同じことを行うことができません

4

3 に答える 3

1

によって明示的に実装されています。使用するには、参照をBindingListにキャストする必要があります。collectionIBindingList

(collection as IBindingList).AddIndex(property);

http://msdn.microsoft.com/en-us/library/ms132679.aspx

さらに読む

インターフェイス自体の参照を介した明示的な実装とアクセスのポイントは、2 つの当事者が同じメソッド シグネチャを持つ 2 つの別個のインターフェイスを作成するという名前の競合を解決することです。これにより、両方のインターフェイスを実装しながらメソッドを明確にすることができます。

于 2012-11-23T16:38:28.590 に答える
1

これは、暗黙的ではなく、インターフェイスの明示的な実装であるためです。これは、型自体ではなく、インターフェイスを介して呼び出す必要があることを意味します。例えば:

((IBindingList)collection).AddIndex(property);

明示的なインターフェイスの実装の詳細については、こちらを参照してください。

于 2012-11-23T16:39:00.647 に答える
1

BindingListを明示的に実装IBindingListしているため、実行する必要があります

(collection as IBindingList).AddIndex(property);
于 2012-11-23T16:39:51.993 に答える