2010-05-07 99 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()來搜索樹。