Listview删除项目索引源正在使用wpf
Listview Delete Item Index source is in use wpf
我想从 observablecollection
中删除项目
ObservableCollection<GetterSetter> _getterSetter = new ObservableCollection<GetterSetter>();
public ObservableCollection<GetterSetter> showList
{
get { return this._getterSetter; }
}
所以我的xaml文件是这样的,
<ListView x:Name="listView" Grid.Row="1" SelectionChanged="listView_SelectionChanged" Foreground="Black" ItemsSource="{Binding ListViewCollection}" SelectedItem="{Binding SelectedListViewItem,Mode=TwoWay}" SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="180" DisplayMemberBinding="{Binding ShowName}"/>
</GridView>
我这里有一个 ShowName getter setter,
private string _showName;
public String ShowName{
get { return _showName; }
set
{
if (value == _showName) return;
_showName = value;
OnPropertyChanged();
}
我想像这样删除选定的项目,但出现错误,
listView.Items.Remove(listView.SelectedItems[0]);
showList.RemoveAt(listView.Items.IndexOf(listView.SelectedItems[0]));
我也试过这个
var delete = SelectedListViewItem;
listView.Items.Remove(delete);
并且都给了我这个错误,
An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll
Additional information: Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.
顺便说一下,GetterSetter
是我的 cs 文件,我的第三个代码片段所在的位置,
public GetterSetter SelectedListViewItem
{
get { return _selectedListViewItem; }
set
{
if (Equals(value, _selectedListViewItem)) return;
_selectedListViewItem = value;
OnPropertyChanged();
}
}
正如错误所说,直接从 ItemsSource 执行。为此,您需要将 ItemsSource 区分为它的类型,然后执行删除操作。
if(SelectedListViewItem != null)
{
// EDIT: Typo in the lambda for FirstOrDefault
var delete = showList.FirstOrDefault(x => SelectedListViewItem.ShowName == x.ShowName);
if(delete != null)
{
((ObservableCollection<GetterSetter>)listView.ItemsSource).Remove(delete);
}
}
编辑:NULL 怪物要抓到你了。
我想从 observablecollection
ObservableCollection<GetterSetter> _getterSetter = new ObservableCollection<GetterSetter>();
public ObservableCollection<GetterSetter> showList
{
get { return this._getterSetter; }
}
所以我的xaml文件是这样的,
<ListView x:Name="listView" Grid.Row="1" SelectionChanged="listView_SelectionChanged" Foreground="Black" ItemsSource="{Binding ListViewCollection}" SelectedItem="{Binding SelectedListViewItem,Mode=TwoWay}" SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="180" DisplayMemberBinding="{Binding ShowName}"/>
</GridView>
我这里有一个 ShowName getter setter,
private string _showName;
public String ShowName{
get { return _showName; }
set
{
if (value == _showName) return;
_showName = value;
OnPropertyChanged();
}
我想像这样删除选定的项目,但出现错误,
listView.Items.Remove(listView.SelectedItems[0]);
showList.RemoveAt(listView.Items.IndexOf(listView.SelectedItems[0]));
我也试过这个
var delete = SelectedListViewItem;
listView.Items.Remove(delete);
并且都给了我这个错误,
An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll
Additional information: Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.
顺便说一下,GetterSetter
是我的 cs 文件,我的第三个代码片段所在的位置,
public GetterSetter SelectedListViewItem
{
get { return _selectedListViewItem; }
set
{
if (Equals(value, _selectedListViewItem)) return;
_selectedListViewItem = value;
OnPropertyChanged();
}
}
正如错误所说,直接从 ItemsSource 执行。为此,您需要将 ItemsSource 区分为它的类型,然后执行删除操作。
if(SelectedListViewItem != null)
{
// EDIT: Typo in the lambda for FirstOrDefault
var delete = showList.FirstOrDefault(x => SelectedListViewItem.ShowName == x.ShowName);
if(delete != null)
{
((ObservableCollection<GetterSetter>)listView.ItemsSource).Remove(delete);
}
}
编辑:NULL 怪物要抓到你了。