直到最近,我才有一个组合框绑定到Linq,在bind方法中查询了IEnumerable的DataService.Obj类型,并且一切正常
private IEnumerable<DataService.Obj> _GeneralList;
private IEnumerable<DataService.Obj> _QueriedList;
private void Bind()
{
_GeneralList = SharedLists.GeneralList;
_QueriedList = _GeneralList.Where(q =>q.ID >1000);
cmbobox.ItemsSource = _QueriedList;
}
然后我必须更改方法以插入新的obj并将该对象设置为默认obj,现在我得到一个“ System.NullReferenceException:对象引用未设置为对象的实例< / em> “例外。我知道这与插入到linq查询的可用数据有关但我无法解决它。我们将非常感激地提供任何帮助。
private IEnumerable<DataService.Obj> _GeneralList;
private IEnumerable<DataService.Obj> _QueriedList;
private void Bind()
{
_GeneralList = SharedLists.GeneralList;
_QueriedList = _GeneralList.Where(q =>q.ID >1000);
cmbobox.ItemsSource = _QueriedList;
DataService.Obj info = new DataService.Obj();
info.ID = "0";
(cmbobox.ItemsSource as ObservableCollection<DataService.Obj>).Insert(0,info);
cmbobox.SelectedIndex = 0;
}
提前致谢
答案 0 :(得分:1)
此表达式: -
(cmbobox.ItemsSource as ObservableCollection<DataService.Obj>)
将返回null。 ItemsSource
是分配给它的。{1}}。在这种情况下,LINQ提供的对象实现IEnumerable<DataService.Obj>
,因此as
返回null(LINQ对ObservableCollection<T>
一无所知,当然也不使用它。)
请参阅此question以创建ToObservableCollection
扩展方法。
那说我猜你的实际目标是在列表顶部加上“<N/A>
”元素吗?如果是这样,试试这个: -
cmbobox.ItemsSource= Enumerable.Repeat(new DataService.Obj() {ID = 0}, 1)
.Union(_QueriedList));
这将插入ID为0的单个DataService.Obj
实例作为IEnumerable<DataService.Obj
的第一项,后跟_QueriedList中的所有项。无需尝试使用此方法将值插入集合中。
答案 1 :(得分:0)
尝试在绑定到控件之前插入新项目。
private IEnumerable<DataService.Obj> _GeneralList;
private IEnumerable<DataService.Obj> _QueriedList;
private void Bind()
{
_GeneralList = SharedLists.GeneralList;
_QueriedList = _GeneralList.Where(q =>q.ID >1000).ToList();
DataService.Obj info = new DataService.Obj();
info.ID = "0";
_QueriedList.Insert(0,info);
cmbobox.ItemsSource = _QueriedList;
cmbobox.SelectedIndex = 0;
}
答案 2 :(得分:0)
我不认为_GeneralList.Where会返回一个ObservableCollection
所以当你使用as在线投射时: (cmbobox.ItemsSource as ObservableCollection).Insert(0,info);
你总是会得到一个空引用。相反,你可能会这样做:
_GeneralList = SharedLists.GeneralList;
_QueriedList = _GeneralList.Where(q =>q.ID >1000);
// ***this line changed***
cmbobox.ItemsSource = new ObservableCollection<DataService.Obj>(_QueriedList);
DataService.Obj info = new DataService.Obj();
info.ID = "0";
(cmbobox.ItemsSource as ObservableCollection<DataService.Obj>).Insert(0,info);
cmbobox.SelectedIndex = 0;