c# - 每个 ListView 行的删除按钮

标签 c# wpf mvvm

我有一个 ListView 绑定(bind)到一个 Observable 集合“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>

我已经设法用这个处理程序实现了它,但正如您所看到的,这意味着支持代码必须了解有关 View 的详细信息。这会获取从 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);
    }

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

最佳答案

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

关于c# - 每个 ListView 行的删除按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22913935/

相关文章:

mvvm - 如何使用 Collection View MVVM 进行分组?

c# - 如何在 DataGridView 中抑制自动生成的列?

c# - 为什么 ReSharper 告诉我 "implicitly captured closure"?

c# - 获取委托(delegate)的具体返回类型

C# 为 WPF 窗口禁用 aero 捕捉

c# - 使用 MVVM 模式访问模型的最佳实践是什么

c# - 如何将通用列表<匿名类型>转换为通用列表<类名>?

c# - 在 WPF 双向绑定(bind)中,如何检查触发绑定(bind)更改的是 UI 元素还是 ViewModel?

c# - 调整子项大小时保持滚动查看器的相对滚动条偏移量

wpf - 过多的数据绑定(bind)是否会使 WPF 应用程序变慢?有哪些可用的优化技术?