从listview中删除所有项目

问题描述 投票:0回答:1

Visual Studio的新手,尝试将我使用其他语言的VM部署GUI转换为wpf应用程序。我80%的路上,只有几个问题。 GUI具有许多输入字段供用户填写。单击按钮时,这些输入字段将填充列表视图。 listview声明如下:

<ListView x:Name="lstOut" ScrollViewer.HorizontalScrollBarVisibility="Visible" HorizontalAlignment="Left" Height="205" Margin="10,394,0,0" VerticalAlignment="Top" Width="1294"  
          ItemsSource="{Binding MyItems}" SelectionMode="Single">
<ListView.View>
    <GridView>
        <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
        <GridViewColumn Header="CPU" DisplayMemberBinding="{Binding CPU}"/>
        <GridViewColumn Header="RAM" DisplayMemberBinding="{Binding RAM}"/>
        <GridViewColumn Header="IP Address" DisplayMemberBinding="{Binding IP}"/>
        <GridViewColumn Header="Subnet" DisplayMemberBinding="{Binding Subnet}"/>
        <GridViewColumn Header="Port Group" DisplayMemberBinding="{Binding PortGroup}"/>
        <GridViewColumn Header="Gateway" DisplayMemberBinding="{Binding Gateway}"/>
        <GridViewColumn Header="DNS" DisplayMemberBinding="{Binding DNS}"/>
        <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}"/>
        <GridViewColumn Header="Template" DisplayMemberBinding="{Binding Template}"/>
        <GridViewColumn Header="Host" DisplayMemberBinding="{Binding Host}"/>
        <GridViewColumn Header="Site Code" DisplayMemberBinding="{Binding Site}"/>
        <GridViewColumn Header="Folder" DisplayMemberBinding="{Binding Folder}"/>
        <GridViewColumn Header="DataStore" DisplayMemberBinding="{Binding Datastore}"/>
        <GridViewColumn Header="Patch Method" DisplayMemberBinding="{Binding Patch}"/>
        <GridViewColumn Header="HDD1 Size" DisplayMemberBinding="{Binding HDD1Size}"/>
        <GridViewColumn Header="HDD1 Format" DisplayMemberBinding="{Binding HDD1Format}"/>
        <GridViewColumn Header="HDD2 Size" DisplayMemberBinding="{Binding HDD2Size}"/>
        <GridViewColumn Header="HDD2 Format" DisplayMemberBinding="{Binding HDD2Format}"/>
        <GridViewColumn Header="HDD3 Size" DisplayMemberBinding="{Binding HDD3Size}"/>
        <GridViewColumn Header="HDD3 Format" DisplayMemberBinding="{Binding HDD3Format}"/>
        <GridViewColumn Header="HDD4 Size" DisplayMemberBinding="{Binding HDD4Size}"/>
        <GridViewColumn Header="HDD4 Format" DisplayMemberBinding="{Binding HDD4Format}"/>
        <GridViewColumn Header="HDD5 Size" DisplayMemberBinding="{Binding HDD5Size}"/>
        <GridViewColumn Header="HDD5 Format" DisplayMemberBinding="{Binding HDD5Format}"/>
    </GridView>
</ListView.View>

为了将GUI中的项集合添加到listview,以及稍后在代码中导出到csv,我声明了一个如下集合:

public ObservableCollection<MyItem> MyItems { get; set; } = new ObservableCollection<MyItem>();

我能够以这种方式从列表视图中删除所选项目,这似乎很有效:

private void DeleteRow(object sender, RoutedEventArgs e)
{
    MyItem line = lstOut.SelectedItem as MyItem;
    if (line != null)
        MyItems.Remove(line);
}

我所坚持的(其中一件事)是从列表视图中删除所有内容。我尝试了这两种方法:

lstOut.Items.Clear();
lstOut.Items.Remove(MyItems);

但是在使用ItemsSource时,无论是哪种方式都无效。我尝试了lstOut.ItemsSource,但找不到清除所有内容的方法。

我最终这样做,这似乎工作(边缘):

for (int i=0; i < lstOut.Items.Count; i++)
{
    MyItems.Remove(MyItems[i]);
}

这种方法的问题是每按一次按钮就会删除一半的项目数。如果我在列表视图中有9个项目,则将其减少到4,再次单击将其减少到2,然后是1,最后删除。

有人能建议一种更简单的方法来删除一个动作中的所有内容吗?我确信这是一个愚蠢的简单我想念,但会很感激任何建议。

c# wpf listview observablecollection
1个回答
0
投票

ICollection<T>一般和ObservableCollection特别有方法Clear()

所以正确的方式(以及你遵循MVVM的唯一方法)是

MyItems.Clear();

使用Clear with ObservableCollection比多次调用Remove更有效,因为ObservableCollection在添加/删除/替换内部项时会引发通知。关于Clear的一个通知比关于Remove的大量通知要快


为什么这段代码很奇怪呢?

for (int i = 0; i < lstOut.Items.Count; i++)
{
    MyItems.Remove(MyItems[i]);
}

让我们说初始状态是[1,2,3,4],i = 0,lstOut.Items.Count = 4

在第一次迭代后变为[2,3,4],i = 1,lstOut.Items.Count = 3

所以i指向项目3

项目2被跳过了!

应该颠倒正确的循环(从集合中的最后一项到第一项)

for (int i = MyItems.Count - 1; i >= 0; i--)
{
    MyItems.RemoveAt(i);
}

或另一种方法是删除0位置的项目,同时有项目:

while(MyItems.Count > 0)
{
    MyItems.RemoveAt(0);
}
© www.soinside.com 2019 - 2024. All rights reserved.