2010-05-07 3 views
5

вот что я хотел бы сделать. Я получаю список объектов из базы данных и привязываю этот список к элементу управления ListBox. Элементы ListBoxItems состоят из текстового поля и кнопки. Вот что я придумал. До этого момента он работает по назначению. Объект имеет ряд свойств, таких как ID, Name. Если я нажимаю на кнопку в ListBoxItem пункт должен быть стерт из ListBox, а также из базы данных ...WPF - Как получить объект, привязанный к элементу 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> 

Textblock.Text связан с object.Name и ListBoxItem.Tag объекта. TagSelf (который является только копией самого объекта).

Теперь мои вопросы

  1. Если я нажимаю кнопку в ListBoxItem, как я могу получить ListBoxItem и объект, связанный с ним обратно. Чтобы удалить объект из базы данных, мне нужно как-то его восстановить. Я пытался что-то вроде

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

  2. Есть ли способ автоматически обновлять содержимое ListBox при изменении Item Item? Прямо сейчас я достигаю этого

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

Я бы признателен за любую помощь вы можете дать: D Заранее спасибо

ответ

35

Каждый элемент ListBoxItem будет иметь соответствующий элемент в коллекции данных, привязанный к DataContext. И каждый элемент управления в элементе ListBoxItem.ItemTemplate наследует DataContext. Для того, чтобы получить объект за щелчок кнопки вы можете сделать следующее в обработчик события Click:

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

Чтобы иметь изменения в источнике данных автоматически обновляется в окне списка, вы можете использовать ObservableCollection.

1

Используйте ObservableCollection, чтобы увидеть мгновенные автоматические изменения

Получить SelectedItem с помощью DataContext

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

У вас должно быть свойство SelectedItem в вашей модели просмотра, привязанной к выбранному элементу списка. Удалите этот конкретный элемент из вашего ObservableCollection. Ваш список будет отражать изменения.

1

К вопросу 2: Используйте ObservableCollection. Это реализует INotifyCollectionChanged, поэтому элементы будут добавлены и удалены по мере изменения коллекции.

К вопросу 1: Отправлять отправителя в виде кнопки и использовать ее DataContext. Это будет элемент, к которому он привязан. Если вам также нужно получить сам ListBoxItem, вы можете найти VisualTreeHelper.GetParent() для поиска по дереву.

Смежные вопросы