L'opération n'est pas valide alors que ItemsSource est en cours d'utilisation. Accédez et modifiez les éléments avec ItemsControl.ItemsSource à la place

je suis nouveau dans la Liaison et WPF récemment, j'ai appris comment créer un listBox avec plusieurs colonnes à l'aide de la Liaison tech

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

et voici le code:

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

mais le problème était quand j'ai essayé d'utiliser Ajouter ou supprimer l'article ou effacer

 listBoxSS.Items.Clear();

s'il vous Plaît j'ai besoin d'un exemple pour l'utilisation de la source des éléments ou de la façon que je peux AJOUTER ou Supprimer un Élément ou Effacer la liste.

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>

et voici le code:

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

search.employees() obtenir la liste de tous les employés dans ma DB

 listBoxPE.ItemsSource = employees;
        Gemployees = employees;

maintenant, je peux effectuer toutes les méthodes sur Gemployees

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

ListView effectuer un rafraîchissement chaque fois que j'ajoute ou supprime un article de Gemployees!! Cool mais encore un peu de travail sur la reliure. Maintenant je fais un cours d'interface avec chaque ListView pour y mettre mes trucs. Il n'effectuera aucune flexibilité dans L'ajout D'articles.

19
demandé sur slavoo 2012-06-18 22:47:04

7 réponses

Vous êtes de liaison de l' ItemsSource pour une propriété dans le DataContextItems, donc pour mettre à jour la collection, vous devez aller à la Items propriété DataContext et clair.

En outre, le Items propriété doit être de type ObservableCollection, pas List si vous voulez qu'il mette à jour L'UI à chaque fois que le recouvrement sous-jacent change.

votre bit de code qui définit le ItemsSource dans le code derrière n'est pas nécessaire et doit être supprimé. Vous avez seulement besoin de mettre ItemsSource en un seul endroit, pas les deux.

voici un exemple simple de comment cela peut fonctionner:

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

public MyConstructor()
{
    ...

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

Maintenant, quand vous avez:

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

vous êtes de liaison de l' ItemsSourceObservableCollection<Student>, et lorsque vous voulez effacer de la liste, vous pouvez appeler:

Students.Clear()
27
répondu Rachel 2016-10-10 15:27:19

bizarre mais vrai: les frappes suivantes dans mon fichier XAML ont produit l'erreur " Operation is not valid while ItemsSource is in use. Accédez et modifiez les éléments avec ItemsControl.ItemsSource à la place.":

</ItemsControl.ItemTemplate>x`

notez les caractères " x` après la balise de fermeture de l'élément.

13
répondu Brett 2014-06-13 19:35:12

je sais que cette question a été répondue il y a environ 2 ans, mais j'ai eu ce problème moi-même aussi et pensé à une solution possible moi-même, ce qui fonctionne. Peut-être que cela ne fonctionne pas dans certains scénarios et peut-être que je ne vois tout simplement pas quelque chose, mais ça a fonctionné pour moi donc je le partage ici:

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

j'espère sincèrement que cela aide quelqu'un.

9
répondu Matthijs H 2014-06-01 09:21:57

vous devez travailler contre la collecte qui est liée à vos données ItemsSource. Afin d'obtenir des notifications de changement de collection (lorsque des éléments sont ajoutés ou supprimés), vous devez utiliser un ObservableCollection<T>:

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

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

Et vous devez supprimer le ItemsSource="{Binding Items}" déclaration de votre XAML.

3
répondu Douglas 2012-06-18 18:52:45

tard à la fête je sais mais je pense que cette réponse n'est pas tout à fait claire ci-dessus. C'est en rapport avec le POST des personnages voyous, mais cela provoque aussi l'exception:

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

Si ce que tu voulais dire:

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

il est facile comme un nouveau venu (ou avant le premier café du matin) de penser que le premier est correct et l'exception n'explique en aucune façon ce qui est faux.

3
répondu Tim Rutter 2016-11-25 08:44:09

assignez la propriété ItemsSource de la listbox à une propriété publique à l'intérieur de la classe du formulaire. Ensuite, essayez d'ajouter une suppression à partir de cela, en appelant PropertyChanged à l'intérieur du setter, au lieu d'appeler clear directement sur la source des éléments de la boîte de liste.

1
répondu Josh 2012-06-18 18:51:39

j'ai eu ce même problème, et j'ai finalement réalisé que j'essayais d'ajouter un nouvel article directement à la source ItemsSource du contrôle, plutôt qu'à la collecte observable qui servait de source ItemsSource.

je me suis dit que j'allais poster ça, ça pourrait aider d'autres novices wpfers.

0
répondu Travis 2014-04-11 02:21:47