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.
7 réponses
Vous êtes de liaison de l' ItemsSource
pour une propriété dans le DataContext
Items
, 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' ItemsSource
ObservableCollection<Student>
, et lorsque vous voulez effacer de la liste, vous pouvez appeler:
Students.Clear()
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.
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.
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.
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.
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.
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.