可以';t选择项目ListBox:InvalidOperationException

本文关键字:项目 ListBox InvalidOperationException 选择 可以 | 更新日期: 2023-09-27 18:28:07

我用到ObservableCollection的绑定填充我的ListBox。这些项目被添加到ListBox中很好,但当我想选择ListBox的第一个项目时,我会得到一个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();

两者都不起作用,我不知道为什么?

可以';t选择项目ListBox:InvalidOperationException

与使用调度器添加新项目的方式相同,使用它来更改所选项目:

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

Dispatcher调用是异步的,不能保证它们何时运行,所以当您设置所选索引时,该项还不存在。将所有基于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;
});