删除每个ListView行的按钮

时间:2014-04-07 13:28:54

标签: c# wpf mvvm

我有一个列表视图绑定到一个Observable Collection'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#c​​ode:

    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);
    }

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

1 个答案:

答案 0 :(得分:5)

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