.net 为什么在尝试从ObservaleCollection或BindingList中创建子类时会出现NullReferenceException?
我正在使用.net 为什么在尝试从ObservaleCollection或BindingList中创建子类时会出现NullReferenceException?,.net,wpf,ironpython,observablecollection,bindinglist,.net,Wpf,Ironpython,Observablecollection,Bindinglist,我正在使用observateCollections作为一些绑定的项源,并且遇到了一个场景,我想手动调用OnCollectionChanged,通知绑定引擎应该重新检查列表。(类似的BindingList是OnListChanged) 麻烦就从这里开始。令人恼火的是,这些方法受到保护,如果不对这些类型进行子类化,就无法调用它们,但当我尝试子类化时,它失败得惊人——即使我没有指定任何重写方法: >>> class ObservableCollectionEx(System.Coll
observateCollection
s作为一些绑定的项源,并且遇到了一个场景,我想手动调用OnCollectionChanged
,通知绑定引擎应该重新检查列表。(类似的BindingList
是OnListChanged
)
麻烦就从这里开始。令人恼火的是,这些方法受到保护
,如果不对这些类型进行子类化,就无法调用它们,但当我尝试子类化时,它失败得惊人——即使我没有指定任何重写方法:
>>> 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.
>类ObservableCollectionEx(System.Collections.ObjectModel.ObservableCollection):
... 通过
...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
SystemError:对象引用未设置为对象的实例。
>>>类BindingListEx(System.ComponentModel.BindingList):
... 通过
...
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
SystemError:对象引用未设置为对象的实例。
我就要放弃了,我只想给CollectionChanged打一个该死的电话!救命啊 支持对
observateCollection
和BindingList
进行子分类。下面是我为BindingList
编写的一个示例,它公开了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();
}
}
类BindingListEx:BindingList
{
public void ForceListChanged()
{
base.OnListChanged(新的ListChangedEventArgs(ListChangedType.Reset,0));
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var list=new BindingListEx();
增加(42);
list.ForceListChanged();
}
}
支持对可观察收集
和绑定列表
进行子分类。下面是我为BindingList
编写的一个示例,它公开了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();
}
}
类BindingListEx:BindingList
{
public void ForceListChanged()
{
base.OnListChanged(新的ListChangedEventArgs(ListChangedType.Reset,0));
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var list=new BindingListEx();
增加(42);
list.ForceListChanged();
}
}
在做了更多的研究之后,我找到了一个解决办法。阅读可以让我们了解幕后发生的事情,最显著的解释是:
Closed Construct generic是一个术语,用于表示子类为非泛型且基类参数化为具体类型的场景
因此,在本例中,
BindingListEx
是非泛型的,并且来自BindingList
参数化基类的子类已作为其参数馈送str
。这项措施目前有效。如果有人知道如何进行开放构造泛型继承(上面的第二种形式),请随意在这里发布,您将得到公认的答案,因为这是我最初的目标。现在,这将不得不做。在做了更多的研究之后,我找到了一个解决办法。阅读可以让我们了解幕后发生的事情,最显著的解释是:
Closed Construct generic是一个术语,用于表示子类为非泛型且基类参数化为具体类型的场景
因此,在本例中,
BindingListEx
是非泛型的,并且来自BindingList
参数化基类的子类已作为其参数馈送str
。这项措施目前有效。如果有人知道如何进行开放构造泛型继承(上面的第二种形式),请随意在这里发布,您将得到公认的答案,因为这是我最初的目标。就目前而言,这是必须的。您能给我们看一下这两种类型的定义吗?您能给我们看一下这两种类型的定义吗?谢谢,但我的问题是Ironpython(如果这在c#中不起作用,那将是很遗憾的)。我可能缺少的是在类定义中显示该部分的语法;我不知道Ironpython是如何做到这一点的,或者这里是否需要它。@Aphex Ironpython使用[int]
代替
来表示泛型,但我不确定您是否可以在Ironpython中声明泛型类型。这似乎是您问题的根源。谢谢,但我的问题是在Ironpython中(如果在c#中不起作用,那将很遗憾)。我可能缺少的是在类定义中显示该部分的语法;我不知道Ironpython是如何做到这一点的,或者这里是否需要它。@Aphex Ironpython使用[int]
代替
来表示泛型,但我不确定您是否可以在Ironpython中声明泛型类型。这似乎是你问题的根源。
public class SubClass<T> : BaseClass<T> {...}
>>> 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")
>>>