无法将对象插入silverlight数据绑定组合框中

时间:2010-05-04 15:56:04

标签: c# silverlight

直到最近,我才有一个组合框绑定到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;
}

提前致谢

3 个答案:

答案 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;