这是我想做的。我从数据库中获取对象列表,并将此列表绑定到ListBox控件。 ListBoxItems包含一个文本框和一个按钮。这就是我想出的。到目前为止,它按预期工作。 该对象有许多属性,如ID,Name。如果我单击ListBoxItem中的按钮,则应从ListBox和数据库中删除Item ...
<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(它只是对象本身的副本)。
现在我的问题
如果我单击listboxItem中的按钮,我如何获取listboxitem以及绑定到它的对象。为了从数据库中删除对象,我必须以某种方式检索它。我试过像
这样的东西 ListBoxItem lbi1 =
(ListBoxItem)(taglistBox.ItemContainerGenerator.ContainerFromItem(taglistBox.Items.CurrentItem));
ObjectInQuestion t =(ObjectInQuestion)lbi1.Tag;
如果Itemssource发生变化,有没有办法自动更新ListBox的内容?现在我正在通过
实现这一目标 taglistBox.ItemsSource = null;
taglistBox.ItemsSource = ObjectInQuestion;
我很感激你能给予的任何帮助:D 提前致谢
答案 0 :(得分:37)
每个ListBoxItem都将数据绑定集合中的相应项目作为DataContext。 ListBoxItem.ItemTemplate中的每个控件都将继承DataContext。要获取单击按钮后面的对象,可以在单击事件处理程序中执行以下操作:
MyClass item = (MyClass)(sender as Button).DataContext;
要将数据源中的更改自动更新到列表框,可以使用ObservableCollection。
答案 1 :(得分:1)
使用ObservableCollection查看即时自动更改
使用DataContext
获取SelectedItemprivate void Button_Click(object sender, RoutedEventArgs e)
{
var btn = sender as Button;
myListBox.SelectedItem = btn.DataContext;
}
您的viewmodel中应该有一个SelectedItem属性绑定到列表框的selectedItem。从ObservableCollection中删除该特定项。您的列表框将反映更改。
答案 2 :(得分:1)
问题2:使用ObservableCollection。这实现了INotifyCollectionChanged,因此在集合更改时将添加和删除项目。
问题1:将发件人转换为按钮并使用它的DataContext。这将是它所绑定的项目。如果您还需要获取ListBoxItem本身,可以VisualTreeHelper.GetParent()
来搜索树。