1

一部のバインディングの ItemsSource として sを使用していますが、バインディング エンジンによってリストを再チェックする必要があることを通知するために手動でObservableCollection呼び出したいシナリオに遭遇しました。OnCollectionChanged(BindingListアナログは ですOnListChanged)。

ここからトラブルが始まります。腹立たしいことに、これらのメソッドはprotected、これらの型をサブクラス化せずに呼び出すことはできません。Ironpython はこれをサポートしていますが、サブクラス化しようとすると、オーバーライド メソッドを指定していなくても、見事に失敗します。

>>> class ObservableCollectionEx(System.Collections.ObjectModel.ObservableCollection):
...     pass
... 
Traceback (most recent call last):
  File "<string>", line 1, in <module>
SystemError: Object reference not set to an instance of an object.

>>> class BindingListEx(System.ComponentModel.BindingList):
...     pass
... 
Traceback (most recent call last):
  File "<string>", line 1, in <module>
SystemError: Object reference not set to an instance of an object.

私はあきらめようとしていますOnCollectionChanged。ヘルプ!

4

2 に答える 2

1

ObservableCollection<T>との両方のサブクラス化BindingList<T>は、サポートされている操作です。これは私が書いたサンプルで、例外BindingList<T>を公開OnListChangedしてスローしません

class BindingListEx<T> : BindingList<T>
{
    public void ForceListChanged()
    {
        base.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, 0));
    }
}


class Program
{
    static void Main(string[] args)
    {
        var list = new BindingListEx<int>();
        list.Add(42);
        list.ForceListChanged();
    }
}
于 2011-08-08T17:04:48.760 に答える
0

さらに調査を行った後、回避策を見つけました。ジェネリック クラスからの継承に関するこの記事を読むと、舞台裏で何が起こっているのか、特に次の説明に光が当てられます。

クローズド コンストラクト ジェネリックは、サブクラスが非ジェネリックであり、基本クラスが具象型としてパラメーター化されるシナリオを指すために使用される用語です。

public class SubClass : BaseClass<int>   {...}

オープン コンストラクト ジェネリックは、基本クラスとサブクラスの両方がジェネリック型としてパラメーター化されるシナリオを指すために使用される用語です。

public class SubClass<T> : BaseClass<T> {...}

ObservableCollectionsこれによると、元の投稿 ( andから継承) でやろうとしていることはBindingLists、2 番目の形式です。ベースクラスとサブクラスの両方をパラメータ化しようとしています。これはIronPython で何らかの方法で可能にならなければならないとまだ考えていますが、それを行うための構文を理解できないので、今のところ最初の形式で解決します。そして、なんと、それは機能します:

>>> class BindingListEx(System.ComponentModel.BindingList[str]):
...     pass
... 
>>> 
>>> b = BindingListEx()
>>> b
<BindingListEx object at 0x000000000000002C>
>>> b.Add(3)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: expected str, got int
>>> b.Add("cow")
>>> 

したがって、この例では、BindingListExは非ジェネリックであり、パラメーターとしてBindingList渡されたパラメーター化された基本クラスのサブクラスstrです。これは今のところ機能します。誰かが Open Construct ジェネリック継承 (そこにある 2 番目の形式) を行う方法を理解した場合は、ここに自由に投稿してください。それが私の当初の目標だったので、受け入れられた答えが得られます。今のところ、これを行う必要があります。

于 2011-08-08T18:22:01.897 に答える