вот то, что я хотел бы сделать. Я получаю Список объектов от базы данных и связываю этот список с Управлением 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 (который является просто копией самого объекта).
Теперь мои вопросы
Если я нажимаю кнопку в listboxItem, как я получаю listboxitem и объект, связанный с ним назад. Для удаления объекта из базы данных, я должен получить его так или иначе. Я попробовал что-то как
ListBoxItem lbi1 =
(ListBoxItem) (taglistBox. ItemContainerGenerator. ContainerFromItem (taglistBox. Объекты. CurrentItem)); ObjectInQuestion t = (ObjectInQuestion) lbi1. Тег;
Существует ли способ автоматически обновить содержание ListBox, если Itemssource изменяется? Прямо сейчас я достигаю этого
taglistBox. ItemsSource = пустой указатель;
taglistBox. ItemsSource = ObjectInQuestion;
Я ценил бы любую справку, которую можно дать :D Заранее спасибо
Каждый ListBoxItem будет иметь соответствующий элемент в коллекции data bound в качестве DataContext. И каждый элемент управления в ListBoxItem.ItemTemplate будет наследовать DataContext. Чтобы получить объект за нажатой кнопкой, можно сделать следующее в обработчике события click:
MyClass item = (MyClass)(sender as Button).DataContext;
Чтобы изменения в источнике данных автоматически обновлялись в поле списка, можно использовать ObservableCollection.
Используйте ObservableCollection, чтобы видеть мгновенные автоматические изменения
Получите SelectedItem, используя DataContext
private void Button_Click(object sender, RoutedEventArgs e)
{
var btn = sender as Button;
myListBox.SelectedItem = btn.DataContext;
}
У вас должно быть свойство SelectedItem в вашей вью-модели, связанное с selectedItem списка. Удалите этот конкретный элемент из вашей коллекции ObservableCollection. Ваш listbox отразит изменения.
На вопрос 2: используйте ObservableCollection. Это реализует INotifyCollectionChanged, поэтому элементы будут добавляться и удаляться по мере изменения коллекции.
К вопросу 1: Используйте отправителя как кнопку и используйте его DataContext. Это будет предмет, к которому он привязан. Если вам также нужно получить сам ListBoxItem, вы можете использовать VisualTreeHelper.GetParent ()
для поиска по дереву.