2014-12-01 56 views
0

我有一个嵌套的Listbox(主对象列表中的对象的集合)需要删除基础项目。
删除项目时,我可以重置主列表的ItemsSource,但主列表将包含大量项目,并且每次从其基础集合中删除项目主滚动条也将被重置,使用户愿意以非常痛苦的方式杀死我。
我的问题:我如何才能找到已被点击了哪个按钮项目的容器,我怎么能找到该项目本身,所以我可以杀@ & $ * &#$ @(咒骂象声词)!?
下面是我列出的XAML为例:从按钮上的嵌套ListView中删除ListItem点击

<ListView Name="mainList"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Column 1" /> 
      <GridViewColumn Header="Column 2" /> 
      <GridViewColumn Header="Column 3" /> 
      <GridViewColumn Header="Collection column"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <ListBox ItemsSource="{Binding BindingCollectionProperty}"> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <Grid> 
             <TextBlock Grid.Column="0" Text="{Binding Item.Property}" /> 
             <TextBlock Grid.Column="1" Text="{Binding Item.AnotherProperty}" /> 
             <Button Content="remove" Grid.Column="2" Click="DeleteClickEvent" /> 
            </Grid> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

如何是我DeleteClickEvent(object sender, RoutedEventArgs e)应该是怎样的?

回答

0

你可以有一个命令,并把它传递您的项目作为参数,而不是一个单击处理程序:

<Button ... Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type YOURCUSTOMCONTROL}}, Path=DataContext.YOURCOMMAND}" 
      CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" /> 

如果你想保持你的事件处理程序,你可以发送方使用VisualTreeHelper.GetParent两次。

ListBoxItem item = VisualTreeHelper.GetParent(VisualTreeHelper.GetParent((DependencyObject)sender)) As ListBoxItem; 

BindingCollectionProperty.Remove(item); 
+0

是不是最花哨的方法,但似乎已经解决了我的问题!感谢名单! – 2014-12-08 17:20:29