Ошибка: коллекция элементов должна быть пустой перед использованием ItemsSource в списке.

Я просмотрел подобные вопросы здесь, но не смог найти тот, который соответствует моей ошибке (это сработало). Мой код:

public MainWindow()
    {
        InitializeComponent();
    }

    public List<item> loadedCategory = new List<item>();

    private void Open_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        if (openFileDialog.ShowDialog() == true)
        {
            List<item> loadedCategory = loaders.category_loader(openFileDialog.FileName);
        }

        left_panel_lower_list.ItemsSource = loadedCategory;
    }

объект item — это просто DTO, который содержит 4 свойства. loaders.category_loader возвращает list из itemс. Ошибка отмечается в конце строки назначения ItemSource. Я пытался переместить строку назначения в большинство других мест в коде, и она никогда не запускается.
Что я делаю неправильно?


person Lex Hammerwood    schedule 06.10.2015    source источник


Ответы (3)


Я бы сделал так:

private ObservableCollection<item> loadedCategory = new ObservableCollection<item>();

public MainWindow()
{
    InitializeComponent();
    left_panel_lower_list.ItemsSource = loadedCategory;
}

private void Open_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    if (openFileDialog.ShowDialog() == true)
    {
        foreach(var item in loaders.category_loader(openFileDialog.FileName)
        {
            loadedCategory.Add(item);
        }
    }        
}

... до тех пор, пока на основе вашего кода. Вы должны подготовить модель представления и использовать привязку в любом случае.

person dytori    schedule 07.10.2015

В приведенном выше коде есть ошибка области видимости, поскольку вы переопределяете локальную переменную с тем же именем, что и поле в вашем классе. По сути, вы получаете данные, а затем игнорируете их, добавляя поле, которое кажется пустым, поэтому я думаю, что проблема.

person netniV    schedule 06.10.2015

Вы должны внимательно понимать значение сообщения об ошибке.

Ошибка: коллекция элементов должна быть пустой перед использованием ItemsSource в списке.

Это означает, что ваш ListBox не должен содержать никаких элементов, прежде чем вы назначите что-то ItemsSource.

Действия для воспроизведения этой проблемы:

  1. Используйте поле со списком и добавьте в него некоторые элементы напрямую в коде XAML.
  2. Затем в коде программной части установите свойство itemssource.
  3. Вы получите это исключение.

Как избежать этой ошибки:

Используйте либо Items Collection, либо ItemsSource, но не оба варианта одновременно.

person AnjumSKhan    schedule 07.10.2015