WPF - Как мне вернуть объект, связанный с ListBoxItem - PullRequest
6 голосов
/ 07 мая 2010

вот что я хотел бы сделать. Я получаю список объектов из базы данных и связываю этот список с элементом управления ListBox. Элементы ListBoxItems состоят из текстового поля и кнопки. Вот что я придумал. До этого момента он работает как задумано. Объект имеет ряд свойств, таких как идентификатор, имя. Если я нажму на кнопку в ListBoxItem, элемент должен быть удален из ListBox, а также из базы данных ...

<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 к object.TagSelf (который является просто копией самого объекта).

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

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

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

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

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

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

Ответы [ 3 ]

37 голосов
/ 07 мая 2010

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

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

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

1 голос
/ 07 мая 2010

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

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

1 голос
/ 07 мая 2010

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

Получить SelectedItem, используя DataContext

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

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

...