【问题标题】:Cant insert a object into a silverlight databound combo box无法将对象插入到 silverlight 数据绑定组合框中
【发布时间】:2010-05-04 15:56:04
【问题描述】:

直到最近我有一个组合框,它在 bind 方法中绑定到一个 Linq 查询的 DataService.Obj 类型的 IEnumerable,并且一切正常

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:对象引用未设置为对象的实例”异常。我知道这与插入到 linq 查询的 ienumerable 中有关,但我无法修复它。任何帮助将不胜感激。

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;
}

提前致谢

【问题讨论】:

    标签: c# silverlight


    【解决方案1】:

    这个表达式:-

    (cmbobox.ItemsSource as ObservableCollection<DataService.Obj>)
    

    将返回空值。 ItemsSource 是分配给它的。在这种情况下,实现 IEnumerable&lt;DataService.Obj&gt; 的 LINQ 提供的对象因此 as 返回 null(LINQ 对 ObservableCollection&lt;T&gt; 一无所知,当然也不会使用它)。

    查看此question 以创建ToObservableCollection 扩展方法。

    也就是说,我猜你的实际目标是在列表顶部添加“&lt;N/A&gt;”元素,对吧?如果是这样试试这个:-

     cmbobox.ItemsSource=  Enumerable.Repeat(new DataService.Obj() {ID = 0}, 1)
                         .Union(_QueriedList));
    

    这会将 ID 为 0 的单个 DataService.Obj 实例插入为 IEnumerable&lt;DataService.Obj 的第一项,然后是 _QueriedList 中的所有项。无需尝试使用这种方法将值插入到集合中。

    【讨论】:

    • 我最终创建了一个扩展方法,因为 .Union 方法对我不起作用。对于我的方法失败的原因以及该方法的一般目的,您是完全正确的。谢谢
    【解决方案2】:

    在绑定到控件之前尝试插入新项目。

    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; 
    } 
    

    【讨论】:

      【解决方案3】:

      我认为 _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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多