Операция недействительна во время использования ItemsSource. Доступ и изменение элементов с помощью ItemsControl.ItemsSource вместо - программирование
Подтвердить что ты не робот

Операция недействительна во время использования ItemsSource. Доступ и изменение элементов с помощью ItemsControl.ItemsSource вместо

Я недавно в Binding и WPF недавно узнал, как создать listBox с несколькими столбцами, используя технологию Binding

 <ListView ItemsSource="{Binding Items}" Margin="306,70,22,17" MouseDoubleClick="listBoxSS_MouseDoubleClick" Name="listBoxSS" >           
    <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="first_name " Width="100" DisplayMemberBinding="{Binding Path=First_name}" />
                    <GridViewColumn Header="last_name" Width="100" DisplayMemberBinding="{Binding Path=Last_name}" />
                    <GridViewColumn Header="phone_number" Width="100" DisplayMemberBinding="{Binding Path=Phones[0]}" />
                    <GridViewColumn Header="notes" Width="100" DisplayMemberBinding="{Binding Path=Notes}" />
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

и это код:

List<Student> arr = search.students();
        listBoxSS.ItemsSource = arr;

но проблема была в том, что я попытался использовать добавление или удаление элемента или очистить

 listBoxSS.Items.Clear();

Мне нужен пример использования источника элементов или способ добавления или удаления элемента или удаления списка.

EDIT:

<ListView ItemsSource="{Binding Items}" Margin="306,70,22,17" MouseDoubleClick="listBoxSS_MouseDoubleClick" Name="listBoxSS" >
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="first_name " Width="100" DisplayMemberBinding="{Binding Path=First_name}" />
                <GridViewColumn Header="last_name" Width="100" DisplayMemberBinding="{Binding Path=Last_name}" />
                <GridViewColumn Header="phone_number" Width="100" DisplayMemberBinding="{Binding Path=Phones[0]}" />
                <GridViewColumn Header="notes" Width="100" DisplayMemberBinding="{Binding Path=Notes}" />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

и вот код:

 ObservableCollection<Employee> Gemployees;
var employees = new ObservableCollection<Employee>(search.employees());

search.employees() получить список всех сотрудников в моей БД

 listBoxPE.ItemsSource = employees;
        Gemployees = employees;

теперь я могу выполнять все методы в Gemployees

 Gemployees.Remove((Student)listBoxSS.SelectedItem);
 Gemployees.Add((Student)listBoxSS.SelectedItem);

ListView выполняет обновление, когда я добавляю или удаляю элемент из Gemployees!! Прохладная, но все же небольшая работа над привязкой. Теперь я делаю класс интерфейса для каждого ListView, чтобы я мог поместить в него свои вещи. Он не будет выполнять какую-либо гибкость при добавлении элементов.

4b9b3361

Ответ 1

Вы привязываете ItemsSource к свойству в DataContext под названием Items, поэтому для обновления коллекции вам нужно перейти в свойство Items в DataContext и удалить его.

Кроме того, свойство Items должно иметь тип ObservableCollection, а не List, если вы хотите, чтобы он обновлял пользовательский интерфейс при изменении базовой коллекции.

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

Вот простой пример того, как он может работать:

// Using Students instead of Items for the PropertyName to clarify
public ObservableCollection<Student> Students { get; set; }

public MyConstructor()
{
    ...

    Students = search.students();
    listBoxSS.DataContext = this;
}

Теперь, когда у вас есть:

<ListView ItemsSource="{Binding Students}" ... />

вы привязываете ItemsSource к ObservableCollection<Student>, и когда вы хотите очистить список, вы можете позвонить:

Students.Clear()

Ответ 2

Странно, но верно: следующие ошибочные нажатия клавиш в моем XAML файле вызвали ошибку "Операция недействительна при использовании ItemsSource. Вместо этого выберите и измените элементы с помощью ItemsControl.ItemsSource.":

</ItemsControl.ItemTemplate>x`

Обратите внимание на символы "x" после тега закрывающего элемента.

Ответ 3

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

listView.ClearValue(ItemsControl.ItemsSourceProperty);
listView.ItemsSource = NewSource;

Я искренне надеюсь, что это поможет кому-то.

Ответ 4

Вам нужно работать против коллекции, привязанной к данным, к вашему ItemsSource. Чтобы получать уведомления об изменении коллекции (когда элементы добавляются или удаляются), вы должны использовать ObservableCollection<T>:

var students = new ObservableCollection<Student>(search.students());
listBoxSS.ItemsSource = students;

students.Clear();
students.Add(new Student("ABC"));

И вы должны удалить объявление ItemsSource="{Binding Items}" из своего XAML.

Ответ 5

Назначьте свойство ItemsSource списка в общедоступное свойство внутри класса формы. Затем попробуйте добавить удаление из него, вызывая PropertyChanged внутри установщика, вместо того, чтобы напрямую обращаться к источнику элементов списка.

Ответ 6

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

<ItemsControl ItemsSource="{Binding AnObservableCollection}">
    <Label Content="{Binding Name}"/>
</ItemsControl>

Когда вы имели в виду:

<ItemsControl ItemsSource="{Binding AnObservableCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Label Content="{Binding Name}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Легко как новичок (или до первого утреннего кофе) думать, что первое правильно, и исключение никоим образом не объясняет, что не так.

Ответ 7

У меня была эта же проблема, и я в конце концов понял, что я пытался добавить новый элемент непосредственно в элемент управления ItemsSource, а не в ObservableCollection, который служил в качестве ItemsSource.

Я решил, что опубликую это, так как это может помочь другим начинающим wpfers.