2014-12-01 2 views
0

У меня есть вложенный список (коллекция объектов в списке основных объектов), которым необходимо удалить базовые элементы.
Когда элемент будет удален, я мог бы переустановить ItemsSource основного списка, но в главном списке будет множество предметов, и каждый раз, когда элемент будет удален из его базовой коллекции, также будет сброшена основная полоса прокрутки , заставляя пользователей желать убить меня очень болезненно.
Мой вопрос: Как я могу найти контейнер элемента, какая кнопка была нажата, и как я могу найти сам элемент, так что я могу убить @ & $ * & # $ @ (проклиная звукоподражания)!?
Вот XAML Exemple из моих списков:Удалить ListItem из вложенного списка List на кнопке Нажмите

<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

не самый причудливый подход, но, похоже, решил мою проблему! спасибо! –