我有一个非常简单的列表管理操作,其中我有以下类型的列表:
private class BMark
{
public string folder { get; set; }
public string shortName { get; set; }
}
private List<BMark> mBookmarks;
列表mBookMarks在使用GridView的ListView中用作ItemSource。这是标记:
<ListView Margin="5" Name="lvBookmarks"
SelectionChanged="lvBookmarks_SelectionChanged" >
<ListView.View >
<GridView x:Name="gridView" >
<GridViewColumn Header="Folder Path" Width="350"
DisplayMemberBinding="{Binding folder}" />
<GridViewColumn Header="Short Name" Width="170"
DisplayMemberBinding="{Binding shortName}" />
</GridView>
</ListView.View>
</ListView>
下面是代码的一部分:
private void btnApply_Click(object sender, RoutedEventArgs e)
{
mBookmarks[lvBookmarks.SelectedIndex].shortName = txtShortName.Text;
lvBookmarks.Items.Refresh();
}
private void btnDelete_Click(object sender, RoutedEventArgs e)
{
mBookmarks.RemoveAt(lvBookmarks.SelectedIndex);
lvBookmarks.Items.Refresh();
}
private void btnMoveDown_Click(object sender, RoutedEventArgs e)
{
if (lvBookmarks.SelectedIndex >= lvBookmarks.Items.Count - 1) return;
int x = lvBookmarks.SelectedIndex;
mBookmarks.Reverse(x, 2);
lvBookmarks.Items.Refresh();
lvBookmarks.SelectedIndex = x + 1;
}
private void btnMoveUp_Click(object sender, RoutedEventArgs e)
{
if (lvBookmarks.SelectedIndex == 0) return;
int x = lvBookmarks.SelectedIndex;
mBookmarks.Reverse(x - 1, 2);
lvBookmarks.Items.Refresh();
lvBookmarks.SelectedIndex = x - 1;
}
btnApply_Click只是简单地将更改应用到列表中的shortName。btnMoveDown和btnMoveUp将所选项目向下或向上移动。所有这些都可以与上面显示的代码一起工作。然而,btnDelete让我抓狂。项目从mBookmarks列表中删除,但调用lvBookmarks.Items.Refresh()会导致以下异常:
System.ArgumentOutOfRangeException:'索引超出范围。必须为非负数且小于集合的大小。(参数' index ')'
如果我不调用lvBookmarks.Items.Refresh(),GridView不会更新,如果我尝试选择一个超出新计数的项目,我会得到上面显示的相同异常(如预期的那样)。
我已经搜索了我所知道的每一个来源,但还没有找到任何类似的东西。有很多的例子使用ListView与GridView,但他们似乎没有一个专注于更新。我已经做了所有这些在Windows窗体-这是非常容易做的所有者绘制列表。
1条答案
按热度按时间weylhg0b1#
如果将
List<BMark>
替换为ObservableCollection<BMark>
,则无需调用Refresh()
: