簡體   English   中英

無法將對象插入Silverlight數據綁定組合框中

[英]Cant insert a object into a silverlight databound combo box

直到最近,我還有一個組合框,該組合框已綁定到bind方法中的Linq查詢的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:對象引用未設置為對象的實例 ”異常。 我知道這與插入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;
}

提前致謝

這個表達:

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

將返回null。 ItemsSource是曾經分配給它的東西。 在這種情況下,LINQ提供的對象實現IEnumerable<DataService.Obj>因此as返回null(LINQ不了解ObservableCollection<T>並且肯定不使用它)。

請參閱此問題以創建ToObservableCollection擴展方法。

那就是說,我會猜測您的實際目標是將“ <N/A> ”元素放在列表頂部嗎? 如果是這樣,請嘗試:

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

這將作為ID為0的單個DataService.Obj實例作為IEnumerable<DataService.Obj的第一項插入,然后插入_QueriedList中的所有項。 無需嘗試使用此方法將值插入集合。

綁定到控件之前,請嘗試插入新項目。

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

我不認為_GeneralList.Where將返回ObservableCollection

因此,當您在行上使用as進行投射時:(cmbobox.ItemsSource作為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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM