2010-05-07 21 views
5

esto es lo que me gustaría hacer. Obtengo una Lista de objetos de una base de datos y ato esta lista a un Control ListBox. ListBoxItems consiste en un cuadro de texto y un botón. Esto es lo que se me ocurrió. Hasta este punto, funciona según lo previsto. El objeto tiene una serie de Propiedades como ID, Nombre. Si hago clic en el botón en el ListBoxItem el artículo debe ser borrado del cuadro de lista y también de la base de datos ...WPF - ¿Cómo puedo obtener un objeto que está vinculado a un ListBoxItem atrás

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

El Textblock.Text está obligado a object.Name y la ListBoxItem.Tag a objetar. TagSelf (que es solo una copia del objeto en sí).

ahora mis preguntas

  1. si hago clic en el botón en el ListBoxItem como lo consigo el ListBoxItem y el objeto unido a ella de vuelta. Para eliminar el objeto de la base de datos, tengo que recuperarlo de alguna manera. He intentado algo así como

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

  2. ¿Hay alguna manera de actualizar automáticamente el contenido de ListBox si el Itemssource cambia? En este momento estoy logrando eso por

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

lo agradecería cualquier ayuda que puede dar: D Gracias de antemano

Respuesta

35

Cada ListBoxItem tendrá el elemento correspondiente en la colección enlazada a datos como DataContext. Y cada control en ListBoxItem.ItemTemplate heredará el DataContext. Para obtener el objeto detrás del botón de clic se puede hacer lo siguiente en el controlador de eventos de clic:

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

Para que los cambios en la fuente de datos actualizados automáticamente al cuadro de lista, se puede usar un ObservableCollection.

1

Uso ObservableCollection para ver los cambios automáticos instantáneos

Obtener el SelectedItem utilizando el DataContext

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

Debería tener una propiedad SelectedItem en su viewmodel vinculada al elemento selectedbox de la lista. Elimine ese artículo particular de su ObservableCollection. Su listbox reflejará los cambios.

1

A la pregunta 2: Use una ObservableCollection. Esto implementa INotifyCollectionChanged para que los elementos se agreguen y eliminen a medida que cambia la colección.

A la pregunta 1: envíe el remitente como un botón y utilícelo como DataContext. Este será el elemento al que está obligado. Si también necesita obtener el ListBoxItem mismo, puede llamar al VisualTreeHelper.GetParent() para buscar el árbol.

Cuestiones relacionadas