2010-05-07 16 views
5

o to, co chciałbym zrobić. Dostaję Listę obiektów z bazy danych i przypisuję tę listę do Kontrolki ListBox. Elementy ListBoxItems składają się z pola tekstowego i przycisku. Oto, co wymyśliłem. Do tego momentu działa zgodnie z przeznaczeniem. Obiekt ma wiele właściwości, takich jak identyfikator, nazwa. Jeśli kliknę na przycisk w ListBoxItem Item powinny być usunięte z pola listy, a także z bazy danych ...WPF - Jak uzyskać obiekt, który jest związany z ListBoxItem z powrotem

<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.Text jest związany object.Name i ListBoxItem.Tag sprzeciwić. TagSelf (który jest po prostu kopią samego obiektu).

teraz moje pytania

  1. Gdybym kliknij na ListBoxItem jak mogę uzyskać ListBoxItem i przedmiot związany z nim z powrotem. Aby usunąć obiekt z bazy danych, muszę go jakoś odzyskać. Próbowałem coś takiego jak

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

  2. Czy istnieje sposób na automatyczną aktualizację zawartości ListBox, jeśli zmieni się źródło pozycji? Teraz osiągam to przez

    taglistBox.ItemsSource = null;
    taglistBox.ItemsSource = ObjectInQquestion;

będę wdzięczny za każdą pomoc można podać: D góry dzięki

Odpowiedz

35

Każdy element ListBoxItem będzie zawierał odpowiednią pozycję w kolekcji danych jako DataContext. I każda kontrolka w ListBoxItem.ItemTemplate odziedziczy DataContext. Aby uzyskać obiekt za pomocą przycisku kliknięto można wykonać następujące czynności w procedurze obsługi zdarzenia kliknięcia:

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

mieć zmiany w źródle danych automatycznie zaktualizowana do listy, można użyć ObservableCollection.

1

Zastosowanie ObservableCollection zobaczyć natychmiastowe automatyczne zmiany

Pobierz SelectedItem użyciu DataContext

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

Powinieneś mieć właściwość SelectedItem w swoim viewmodelu związanym z wybranym elementem listbox. Usuń ten konkretny przedmiot z ObservableCollection. Twój listbox będzie odzwierciedlał zmiany.

1

Na Pytanie 2: Użyj ObservableCollection. To implementuje INotifyCollectionChanged, więc elementy zostaną dodane i usunięte w miarę zmian kolekcji.

Na Pytanie 1: Oddaj nadawcę jako przycisk i użyj jego DataContext. To będzie przedmiot, do którego się zobowiązuje. Jeśli potrzebujesz także samego ListBoxItem, możesz VisualTreeHelper.GetParent() wyszukać drzewo.

Powiązane problemy