WPF - Comment puis-je obtenir un objet qui est lié à un ListBoxItem dos
voici ce que je voudrais faire. Je reçois une Liste d'objets à partir d'une base de données et lier de cette liste à un Contrôle ListBox. Le ListBoxItems se composent d'une zone de texte et un bouton. Voici ce que j'ai trouvé. Jusqu'à ce point, il fonctionne comme prévu.
L'objet a un certain nombre de Propriétés comme ID, Nom. Si je clique sur le bouton dans le ListBoxItem l'Élément doit être effacé de la liste et aussi à partir de la base de données...
<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>
Textblock.Le texte est lié à l'objet.Le nom et le ListBoxItem.Balise d'objet.TagSelf (qui est juste une copie de l'objet lui-même).
Maintenant mes questions
-
Si je clique sur le bouton dans le listboxItem comment puis-je obtenir le listboxitem et l'objet est lié à dos. Pour supprimer un 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.Éléments.CurrentItem));
ObjectInQuestion t = (ObjectInQuestion) lbi1.Tag; -
Est-il un moyen de mettre à jour automatiquement le contenu de la zone de liste si le Itemssource changements? Je suis en train de réaliser que par
taglistBox.ItemsSource = null;
taglistBox.ItemsSource = ObjectInQuestion;
J'apprécierais toute aide que vous pouvez donner 😀
Merci d'avance
Vous devez vous connecter pour publier un commentaire.
Chaque ListBoxItem aura l'élément correspondant dans les données liées collection DataContext. Et chaque contrôle dans le ListBoxItem.ItemTemplate sera inherint le DataContext. Pour obtenir l'objet derrière cliqué sur le bouton, vous pouvez effectuer les opérations suivantes dans le gestionnaire d'événements click:
Avoir des changements dans la source de données mis à jour automatiquement à la zone de liste, vous pouvez utiliser une ObservableCollection.
À la Question 2: Utilisez une ObservableCollection. Cela met en œuvre INotifyCollectionChanged pour que les articles seront ajoutés et supprimés, comme la collecte des changements.
À la Question 1: Cast le nom de l'expéditeur d'un bouton et d'utiliser du DataContext. Ce sera l'objet auquel il est lié. Si vous devez également obtenir l'ListBoxItem lui-même, vous pouvez vous le
VisualTreeHelper.GetParent()
de recherche en haut de l'arborescence.Utilisation ObservableCollection de voir instantanément les changements automatiques
Obtenir le SelectedItem en utilisant le DataContext
Vous devriez avoir une propriété SelectedItem dans votre viewmodel lié à la zone de liste de selectedItem. Supprimer cet élément particulier de votre ObservableCollection. De votre zone de liste sera de refléter les changements.