问题
I am new in Binding and WPF recently I\'ve learned how to create a listBox with multiple columns using Binding 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>
and this is the code:
List<Student> arr = search.students();
listBoxSS.ItemsSource = arr;
but the problem was when I tried to use add or remove item or clear
listBoxSS.Items.Clear();
Please I need an example for using the items source or the way that I can ADD or Remove Item or Clear the list.
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>
and here is the code:
ObservableCollection<Employee> Gemployees;
var employees = new ObservableCollection<Employee>(search.employees());
search.employees() get the list of all employees in my DB
listBoxPE.ItemsSource = employees;
Gemployees = employees;
now I can perform all the methods on Gemployees
Gemployees.Remove((Student)listBoxSS.SelectedItem);
Gemployees.Add((Student)listBoxSS.SelectedItem);
The ListView perform a refresh whenever I add or remove an Item from Gemployees!! Cool but still a little hard work on binding. Now I am doing an interface class to every ListView so I can put my stuff into it. It wont perform any flexibility in Adding Items.
回答1:
You're binding the ItemsSource to a property in the DataContext called Items, so to update the collection, you need to go to the Items property in the DataContext and clear it.
In addition, the Items property needs to be of type ObservableCollection, not List if you want it to update the UI whenever the underlying collection changes.
Your bit of code that sets the ItemsSource in the code behind is not needed and should be removed. You only need to set the ItemsSource in one place, not both.
Here's a simple example of how it can work:
// Using Students instead of Items for the PropertyName to clarify
public ObservableCollection<Student> Students { get; set; }
public MyConstructor()
{
...
Students = search.students();
listBoxSS.DataContext = this;
}
Now when you have:
<ListView ItemsSource="{Binding Students}" ... />
you're binding the ItemsSource to the ObservableCollection<Student>, and when you want to clear the list you can call:
Students.Clear()
回答2:
Weird but true: the following errant keystrokes in my XAML file produced the error "Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.":
</ItemsControl.ItemTemplate>x`
Note the "x`" characters after the closing element tag.
回答3:
I know this question has been answered about 2 years ago, however I had this problem myself as well and thought of a possible solution myself, which works. Maybe this doesn't work in certain scenarios and maybe I'm simply not seeing something, but it worked for me so I'm sharing it here:
listView.ClearValue(ItemsControl.ItemsSourceProperty);
listView.ItemsSource = NewSource;
I sincerely hope this helps someone.
回答4:
Late to the party I know but I think this answer isn't quite clear above. Its related to the rogue characters post, but this also causes the exception:
<ItemsControl ItemsSource="{Binding AnObservableCollection}">
<Label Content="{Binding Name}"/>
</ItemsControl>
When what you meant was:
<ItemsControl ItemsSource="{Binding AnObservableCollection}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Label Content="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Its easy as a newcomer (or before first morning coffee) to think the first is correct and the exception in no way explains what is wrong.
回答5:
You need to work against the collection that is data-bound to your ItemsSource. In order to get collection change notifications (when items get added or removed), you should use an ObservableCollection<T>:
var students = new ObservableCollection<Student>(search.students());
listBoxSS.ItemsSource = students;
students.Clear();
students.Add(new Student("ABC"));
And you should remove the ItemsSource="{Binding Items}" declaration from your XAML.
回答6:
Assign the ItemsSource property of the listbox to a public property inside the form's class. Then try adding a removing from that, calling PropertyChanged inside the setter, instead of calling clear directly on the listbox items source.
回答7:
I had the same error message appear, resulting from a syntax error. It turns out I was accidentally defining an item in a TreeView that had an ItemsSource defined. I had defined a DataTemplate for the tree view, but accidentally put it directly in <TreeView> instead of <TreeView.Resources>, causing the error.
What I had:
<TreeView ItemSource ="{Binding Items}">
<HierarchicalDataTemplate> ... </HierarchicalDataTemplate>
<DataTemplate> ... </DataTemplate>
</TreeView>
What I should have had:
<TreeView ItemSource ="{Binding Items}">
<TreeView.Resources>
<HierarchicalDataTemplate> ... </HierarchicalDataTemplate>
<DataTemplate> ... </DataTemplate>
</TreeView.Resources>
</TreeView>
回答8:
I had this same problem, and I eventually realized that I was trying to add a new item directly to the control's ItemsSource, rather than to the ObservableCollection that served as the ItemsSource.
I figured I'd post this, as it might help other novice wpfers.
来源:https://stackoverflow.com/questions/11089104/operation-is-not-valid-while-itemssource-is-in-use-access-and-modify-elements-w