WPF - Как я получаю объект, который связывается с ListBoxItem назад

вот то, что я хотел бы сделать. Я получаю Список объектов от базы данных и связываю этот список с Управлением 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. Текст обязан возразить. Имя и ListBoxItem. Тег для возражения. TagSelf (который является просто копией самого объекта).

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

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

    ListBoxItem lbi1 =
    (ListBoxItem) (taglistBox. ItemContainerGenerator. ContainerFromItem (taglistBox. Объекты. CurrentItem)); ObjectInQuestion t = (ObjectInQuestion) lbi1. Тег;

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

    taglistBox. ItemsSource = пустой указатель;
    taglistBox. ItemsSource = ObjectInQuestion;

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

6
задан JonBlumfeld 7 May 2010 в 12:23
поделиться

3 ответа

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

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

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

37
ответ дан 8 December 2019 в 02:21
поделиться

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

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

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

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

1
ответ дан 8 December 2019 в 02:21
поделиться

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

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

1
ответ дан 8 December 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: