Почему я получаю исключение NullReferenceException при попытке создать подкласс из ObservableCollection или BindingList? - PullRequest
1 голос
/ 08 августа 2011

Я использую ObservableCollection s в качестве ItemsSource для некоторых из моих привязок и столкнулся со сценарием, в котором я хотел бы вызвать 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.

Я собираюсь сдаться, ивсе, что я хотел сделать, это сделать один чертов звонок '1013 *!Помогите!

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Подклассы 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();
    }
}
0 голосов
/ 08 августа 2011

После еще нескольких исследований я нашел обходной путь.Чтение этой статьи о наследовании от универсальных классов проливает некоторый свет на то, что происходит за кулисами, особенно это объяснение:

Closed Construct generic - это термин, используемый для обозначениясценарий, в котором подкласс не является универсальным, а базовый класс параметризован как конкретный тип.

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

Универсальный Open Construct - это термин, используемый для обозначения сценария, в котором базовый и подкласс параметризован как универсальный тип.

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

Согласно этому, то, что я пытаюсь сделать в моем первоначальном посте (наследуя от ObservableCollections и BindingLists), относится ко второй форме;пытаясь сохранить и базовый и подкласс параметризованным.Хотя я все еще думаю, что имеет , который в некоторой степени возможен в 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 (вторая форма там), не стесняйтесь опубликовать его здесь, и вы получите приемлемый ответ, так как это было моей первоначальной целью.На данный момент это придется делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...