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,最后删除。
有人可以建议一种更简单的方法来删除一个动作中的所有内容吗?我确信这是一个愚蠢的简单我想念,但我会很感激任何建议。
答案 0 :(得分: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);
}