每个列表视图行的“删除”按钮

本文关键字:删除 按钮 列表 视图 | 更新日期: 2023-09-27 17:57:12

我有一个列表视图绑定到可观察集合"People",People 包含具有属性"Name"的人员,它给了我一个人员表。

我想为这个表的每一行都有一个删除按钮,出现在最后一列。下面是一个有效的实现。但是,处理程序和 XAML 非常交织在一起,这并不好。如何传递我删除了"人员"的哪个成员?

XAML:

 <ListView ItemsSource="{Binding People}" Name="ListViewPeople">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn>
                                    <GridViewColumnHeader>Names</GridViewColumnHeader>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBox Text="{Binding Names}"></TextBox>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <Button Content="Delete" Click="Button_Click_Delete"/>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                 </ListView>

我已经设法使用此处理程序实现了这一点,但正如您所看到的,这意味着支持代码必须详细了解视图。这将获取从 ListView 按下的删除按钮的索引,并从我的可观察集合中删除该值。

C# 代码:

    private void Button_Click_Delete(object sender, RoutedEventArgs e)
    {
        DependencyObject dep = (DependencyObject)e.OriginalSource;
        while ((dep != null) && !(dep is ListViewItem))
        {
            dep = VisualTreeHelper.GetParent(dep);
        }
        if (dep == null)
            return;
        int index = ListViewPeople.ItemContainerGenerator.IndexFromContainer(dep);
        People.RemoveAt(index);
    }

有没有办法将我删除的可观察集合的哪个成员传递给我的处理程序,以便处理程序不必知道存在列表视图等?

每个列表视图行的“删除”按钮

Button btn = (Button)sender;
People.Remove((Person)btn.DataContext);