2013-08-19 129 views
0

我使用綁定到ObservableCollection填充我的ListBox。該項目被添加到ListBox就好了,但是當我要選擇ListBox的第一個項目,我得到一個InvalidOperationException ...無法選擇項目列表框:InvalidOperationException

代碼:

private void PopulateDateListbox() 
{ 
    // clear listbox 
    DateList.Clear(); 

    // get days in month 
    int days = DateTime.DaysInMonth(currentyear, currentmonth); 

    // new datetime 
    DateTime dt = new DateTime(currentyear, currentmonth, currentday); 

    for (int i = 0; i < (days-currentday+1); i++) 
    { 
     // create new dataitem 
     DateItem di = new DateItem(); 
     di.dayint = dt.AddDays(i).Day.ToString(); // day number 
     di.day = dt.AddDays(i).DayOfWeek.ToString().Substring(0, 3).ToUpper(); // day string 
     di.monthint = dt.AddDays(i).Month.ToString(); // month number 
     di.yearint = dt.AddDays(i).Year.ToString(); // year number 

     // add dateitem to view 
     Dispatcher.BeginInvoke(() => DateList.Add(di)); 
    } 

    // select first item in Listbox 
    datelistbox.SelectedIndex = 0; // <= InvalidOperationException 
} 

我也試過:

datelistbox.SelectedItem = datelistbox.Items.First(); 

既不工作,我不知道爲什麼?

+0

您是否在工作線程(UI線程除外)中調用'PopulateDateListbox'? –

+0

PopulateDateListbox在頁面加載的事件處理程序中被調用。 –

+0

發佈你正在得到的錯誤信息 –

回答

1

您正在使用的調度增加新項目,用它來改變所選項目的一樣:

Dispatcher.BeginInvoke(() => datelistbox.SelectedIndex = 0); 
+0

哦,我看到..我正常地得到這樣的事情UnauthorizedException!謝謝。 –

+0

@PhilippeMaes這是因爲它不是跨線程訪問。由於您使用調度程序將元素添加到列表中,並且由於'PopulateDateListbox'正在UI線程上執行(您說你正在從page_load事件處理程序調用它),所以這些項目將不會被添加,直到方法已經完成執行。所以你試圖選擇一個尚未添加的項目。最好的解決方案是完全刪除所有對調度程序的調用。 –

+0

我明白了。有時候不知道何時需要使用調度程序。但我還在學習! –

1

調度調用是異步的對時,他們會遇到無法保證,所以當你設置選定的索引,該項目還不存在。將所有基於UI的工作合併爲一個通話 -

List<DateItem> items = new List<DateItem>(); 
for (int i = 0; i < (days-currentday+1); i++) 
    // Create your items and add them to the list 
Dispatcher.BeginInvoke(() => 
{ 
    DateList.ItemsSource = items; 
    DateList.SelectedIndex = 0; 
});