6

这就是我想做的。我从数据库中获取对象列表并将此列表绑定到 ListBox 控件。ListBoxItems 由一个文本框和一个按钮组成。这是我想出的。到目前为止,它按预期工作。该对象具有许多属性,例如 ID、名称。如果我单击 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 中的按钮,我如何获取 listboxitem 和绑定到它的对象。为了从数据库中删除对象,我必须以某种方式检索它。我尝试了类似的东西

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

  2. 如果 Itemssource 发生变化,有没有办法自动更新 ListBox 的内容?现在我正在通过

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

我将不胜感激您能提供的任何帮助:D 在此先感谢

4

3 回答 3

39

每个 ListBoxItem 将在数据绑定集合中具有相应的项作为 DataContext。而ListBoxItem.ItemTemplate 中的每个控件都会继承DataContext。要获取单击按钮后面的对象,您可以在单击事件处理程序中执行以下操作:

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

要将数据源中的更改自动更新到列表框,您可以使用 ObservableCollection。

于 2010-05-07T12:45:05.413 回答
1

使用 ObservableCollection 查看即时自动更改

使用 DataContext 获取 SelectedItem

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

您的视图模型中应该有一个 SelectedItem 属性,该属性绑定到列表框的 selectedItem。从您的 ObservableCollection 中删除该特定项目。您的列表框将反映更改。

于 2010-05-07T12:42:20.370 回答
1

问题 2:使用 ObservableCollection。这实现了 INotifyCollectionChanged,因此将在集合更改时添加和删除项目。

问题1:将发送者转换为按钮并使用它的DataContext。这将是它绑定的项目。如果您还需要获取 ListBoxItem 本身,您可以VisualTreeHelper.GetParent()搜索树。

于 2010-05-07T12:48:14.587 回答