2010-05-07 16 views
5

Voici ce que je voudrais faire. Je reçois une liste d'objets à partir d'une base de données et lie cette liste à un contrôle ListBox. Les ListBoxItems consistent en une zone de texte et un bouton. Voici ce que j'ai trouvé. Jusqu'à présent, cela fonctionne comme prévu. L'objet a un certain nombre de propriétés telles que ID, Name. Si je clique sur le bouton dans la ListBoxItem l'élément doit être effacé de la zone de liste et aussi de la base de données ...WPF - Comment obtenir un objet lié à un ListBoxItem

<ListBox x:Name="taglistBox">  
         <ListBox.ItemContainerStyle> 
          <Style TargetType="{x:Type ListBoxItem}"> 
           <Setter Property="HorizontalAlignment" Value="Stretch"/> 
           <Setter Property="Template"> 
            <Setter.Value> 
             <ControlTemplate TargetType="ListBoxItem"> 
              <ContentPresenter HorizontalAlignment="Stretch"/> 
             </ControlTemplate> 
            </Setter.Value> 
           </Setter> 
           <Setter Property="Tag" Value="{Binding TagSelf}"></Setter> 
          </Style> 
         </ListBox.ItemContainerStyle> 
         <ListBox.ItemTemplate> 
          <DataTemplate> 
           <Grid HorizontalAlignment="Stretch"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition/> 
            </Grid.ColumnDefinitions> 
            <Button Grid.Column="0" Name="btTag" VerticalAlignment="Center" Click="btTag_Click" HorizontalAlignment="Left"> 
             <Image Width="16" Height="16" Source="/WpfApplication1;component/Resources/104.png"/> 
            </Button> 
            <TextBlock Name="tbtagBoxTagItem" Margin="5" Grid.Column="1" Text="{Binding Name}" VerticalAlignment="Center" />           
           </Grid> 
          </DataTemplate> 
         </ListBox.ItemTemplate> 
        </ListBox> 

Le Textblock.Text est lié à object.Name et ListBoxItem.Tag à l'objet. TagSelf (qui est juste une copie de l'objet lui-même).

Maintenant, mes questions

  1. Si je clique sur le bouton dans la ListBoxItem comment puis-je obtenir le ListBoxItem et l'objet lié à revenir. Afin de supprimer l'objet de la base de données, je dois le récupérer en quelque sorte. J'ai essayé quelque chose comme

    ListBoxItem lbi1 =
    (ListBoxItem) (taglistBox.ItemContainerGenerator.ContainerFromItem (taglistBox.Items.CurrentItem)); ObjectInQuestion t = (ObjectInQuestion) lbi1.Tag;

  2. Existe-t-il un moyen de mettre à jour automatiquement le contenu de la ListBox si la ressource Itemssource change? En ce moment j'y arrive par

    taglistBox.ItemsSource = null;
    taglistBox.ItemsSource = ObjectInQuestion;

Je vous remercie de toute aide que vous pouvez donner: D Merci à l'avance

Répondre

35

Chaque ListBoxItem aura l'élément correspondant dans la collection de données liée en tant que DataContext. Et chaque contrôle dans le ListBoxItem.ItemTemplate héritera le DataContext. Pour obtenir l'objet derrière le bouton cliqué, vous pouvez effectuer les opérations suivantes dans le gestionnaire d'événements, cliquez sur:

MyClass item = (MyClass)(sender as Button).DataContext; 

Pour que les modifications de la source de données automatiquement mis à jour la liste, vous pouvez utiliser un ObservableCollection.

1

Utilisez ObservableCollection pour voir les changements automatiques instantanés

Obtenez le SelectedItem en utilisant le DataContext

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var btn = sender as Button; 
    myListBox.SelectedItem = btn.DataContext; 
} 

Vous devriez avoir une propriété SelectedItem dans votre viewmodel lié à l'élément selected de la liste. Supprimez cet élément particulier de votre ObservableCollection. Votre liste déroulante reflétera les changements.

1

À la question 2: utilisez une collection observable. Ceci implémente INotifyCollectionChanged afin que les éléments soient ajoutés et supprimés à mesure que la collection change.

À la question 1: Transformez l'expéditeur en bouton et utilisez DataContext. Ce sera l'objet auquel il est lié. Si vous devez également obtenir le ListBoxItem lui-même, vous pouvez rechercher le VisualTreeHelper.GetParent() dans l'arborescence.