Как я могу добавить данные из элемента в ListView, не вызывая InvalidOperationException?

У меня есть ListView:

<ListView ItemsSource="{Binding ModuleList}">
    <!--<DataTemplate>
        <StackPanel VerticalAlignment="Top" Margin="10,0,0,0">
            <Image Source="{Binding ModuleImage}" Stretch="UniformToFill"/>
            <TextBlock Text="{Binding ModuleName}"/>
        </StackPanel>
    </DataTemplate>-->
</ListView>

Этот ListView привязан к ModuleList:

public List<Module> ModuleList
{
    get => modulList;
    set
    {
        modulList = value;
        OnPropertyChanged();
    }
}

В списке хранятся объекты типа Module, класс, в котором хранится строка Name, изображение ModuleImage и строка ModuleType:

public class Module
{
    public Image ModuleImage { get; set; }
    public string Name { get; set; }
    public string ModuleType { get; set; }
}

и, наконец, у меня есть еще один класс ModuleLoader, который создает для меня объекты-модули. Модули представляют собой zip-файлы, названные так же, как модуль (например, Input.zip). Там у меня есть изображение и json, где хранятся Name и ModuleType. Затем ModuleLoader распаковывает модули, создает Module с json и добавляет путь изображения к этому объекту.

ModuleList заполняется следующим образом:

//Unzips all modules into the Temp-Folder
modulLoader.LoadAllModules();

//Creates the object of type Module and adds the image path
modulList = modulLoader.GetAllModules();

Теперь, когда я раскомментирую среднюю часть моего Xaml, я получаю исключение после того, как ModuleList был полностью создан (конструктор находится в конце)

Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead

когда

get => modulList;

вызывается


person DudeWhoWantsToLearn    schedule 13.11.2019    source источник


Ответы (1)


Вы должны написать ListView так, вам не хватает ListView.ItemTemplate:

<ListView ItemsSource="{Binding ModuleList}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel VerticalAlignment="Top" Margin="10,0,0,0">
                <Image Source="{Binding ModuleImage}" Stretch="UniformToFill"/>
                <TextBlock Text="{Binding ModuleName}"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Без шаблона элемента невозможно определить, является ли следующий XAML макетом, которому нужно следовать.

person Faenrig    schedule 13.11.2019