在WPF中,如何使用GridView删除ListView中的项

myzjeezk  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(193)

我有一个非常简单的列表管理操作,其中我有以下类型的列表:

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窗体-这是非常容易做的所有者绘制列表。

weylhg0b

weylhg0b1#

如果将List<BMark>替换为ObservableCollection<BMark>,则无需调用Refresh()

private ObservableCollection<BMark> mBookmarks;

private void btnApply_Click(object sender, RoutedEventArgs e)
{
    mBookmarks[lvBookmarks.SelectedIndex].shortName = txtShortName.Text;
}

private void btnDelete_Click(object sender, RoutedEventArgs e)
{
    mBookmarks.RemoveAt(lvBookmarks.SelectedIndex);
}

相关问题