Операция недействительна во время использования 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, чтобы я мог поместить в него свои вещи. Он не будет выполнять какую-либо гибкость при добавлении элементов.
Ответы
Ответ 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.