2010-05-07 36 views
5

这里是我想要做的。我从数据库中获取对象列表,并将此列表绑定到ListBox控件。 ListBoxItems由一个文本框和一个按钮组成。这是我想出来的。到目前为止,它按预期工作。 该对象有许多属性,如ID,Name。如果我按一下按钮在ListBoxItem中的项目应该从列表框擦除,并从数据库...WPF - 如何获取绑定到ListBoxItem的对象返回

<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反对。 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 在此先感谢

回答

35

每个ListBoxItem都将DataContext中的数据绑定集合中的相应项目。并且ListBoxItem.ItemTemplate中的每个控件都将继承DataContext。为了获取对象后面的点击按钮,你可以做的单击事件处理程序如下:

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

要在数据源发生变化自动更新列表框,你可以使用一个ObservableCollection。

1

使用的ObservableCollection看到即时自动更改

使用获取的SelectedItem DataContext的

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

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

1

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

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