it-swarm.com.ru

Операция недопустима, когда 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();

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

Правка:

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

20
Yasser

Вы связываете 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()
28
Rachel

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

</ItemsControl.ItemTemplate>x`

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

13
Brett

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

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

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

9
Matthijs H

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

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

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

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

3
Douglas

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

<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>

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

3
Tim Rutter

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

1
Josh

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

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

0
Travis

У меня было такое же сообщение об ошибке, появившееся из-за синтаксической ошибки. Оказывается, я случайно определил элемент в TreeView, для которого была определена ItemsSource. Я определил DataTemplate для представления дерева, но случайно поместил его непосредственно в <TreeView> вместо <TreeView.Resources>, вызывая ошибку.

Что у меня было:

<TreeView ItemSource ="{Binding Items}">
  <HierarchicalDataTemplate> ... </HierarchicalDataTemplate>
  <DataTemplate> ... </DataTemplate>
</TreeView>

Что я должен был иметь:

<TreeView ItemSource ="{Binding Items}">
  <TreeView.Resources>
    <HierarchicalDataTemplate> ... </HierarchicalDataTemplate>
    <DataTemplate> ... </DataTemplate>
  </TreeView.Resources>
</TreeView>
0
Andrew Case