2010-05-07 7 views
5

hier ist, was ich tun möchte. Ich erhalte eine Liste von Objekten aus einer Datenbank und binde diese Liste an ein ListBox-Steuerelement. Die ListBoxItems bestehen aus einem Textfeld und einer Schaltfläche. Hier ist, was ich mir ausgedacht habe. Bis zu diesem Punkt funktioniert es wie beabsichtigt. Das Objekt hat eine Reihe von Eigenschaften wie ID, Name. Wenn ich auf der Schaltfläche klicken Sie im ListBoxItem sollte das Element aus der List-Box und auch aus der Datenbank gelöscht werden ...WPF - Wie bekomme ich ein Objekt, das an ein ListBoxItem gebunden ist zurück

<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> 

Die Textblock.Text zu object.Name und der ListBoxItem.Tag gebunden ist zu widersprechen. TagSelf (das ist nur eine Kopie des Objekts selbst).

Nun meine Fragen

  1. Wenn ich auf die Schaltfläche im ListBoxItem klicken, wie bekomme ich die ListBoxItem und das Objekt, um es zurück gebunden. Um das Objekt aus der Datenbank zu löschen, muss ich es irgendwie abrufen. Ich habe versucht, etwas wie

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

  2. Gibt es eine Möglichkeit, den Inhalt der ListBox automatisch zu aktualisieren, wenn sich die Itemsource ändert? Im Moment erreiche ich das durch

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

ich jede Hilfe dankbar würden Sie geben können: D Vielen Dank im Voraus

Antwort

35

Jedes ListBoxItem hat das entsprechende Element in der Datengebundenen Auflistung als DataContext. Und jedes Steuerelement in der ListBoxItem.ItemTemplate wird den DataContext erben. Um das Objekt hinter der Anklicken Schaltfläche erhalten Sie die folgend in den Click-Ereignishandler tun können:

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

zu haben, um Änderungen in der Datenquelle automatisch in das Listenfeld aktualisiert wird, können Sie eine ObservableCollection verwenden.

1

Verwenden ObservableCollection sofortige automatische Änderungen sehen

Holen Sie sich das SelectedItem mithilfe der Datacontext

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

Sie sollten eine SelectedItem-Eigenschaft in Ihrem Ansichtsmodell an das selectedItem der Listbox gebunden haben. Löschen Sie dieses bestimmte Objekt aus Ihrer ObservableCollection. Ihre Listbox spiegelt Änderungen wider.

1

Zur Frage 2: Verwenden Sie eine ObservableCollection. Dadurch wird INotifyCollectionChanged implementiert, sodass Elemente hinzugefügt und entfernt werden, wenn sich die Auflistung ändert.

Zur Frage 1: Cast den Absender als eine Schaltfläche und verwenden Sie es DataContext. Dies ist der Gegenstand, an den es gebunden ist. Wenn Sie auch das ListBoxItem selbst holen müssen, können Sie die VisualTreeHelper.GetParent() den Baum durchsuchen.

Verwandte Themen