2010-05-07 34 views
5

đây là những gì tôi muốn làm. Tôi nhận được một danh sách các đối tượng từ một cơ sở dữ liệu và liên kết danh sách này với một ListBox Control. ListBoxItems bao gồm một hộp văn bản và một nút. Đây là những gì tôi nghĩ ra. Tính đến thời điểm này nó hoạt động như dự định. Đối tượng có một số Thuộc tính như ID, Tên. Nếu tôi nhấp vào nút trong ListBoxItem Item nên bị xóa khỏi ListBox và cũng từ cơ sở dữ liệu ...WPF - Làm thế nào để tôi nhận được một đối tượng bị ràng buộc vào một ListBoxItem trở lại

<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> 

Các Textblock.Text là ràng buộc để object.Name và ListBoxItem.Tag để phản đối. TagSelf (chỉ là bản sao của đối tượng).

Bây giờ câu hỏi của tôi

  1. Nếu tôi nhấp vào nút trong ListBoxItem làm thế nào để tôi nhận được ListBoxItem và đối tượng ràng buộc để nó trở lại. Để xóa các đối tượng từ cơ sở dữ liệu tôi phải lấy nó bằng cách nào đó. Tôi đã thử một số nội dung như

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

  2. Có cách nào để tự động cập nhật nội dung của ListBox nếu Itemssource thay đổi không? Ngay bây giờ, tôi đạt được điều đó bằng cách

    danh sách thẻBox.ItemsSource = null;
    taglistBox.ItemsSource = ObjectInQuestion;

Tôi đánh giá cao bất kỳ giúp bạn có thể cung cấp: D Cảm ơn trước

Trả lời

35

Mỗi ListBoxItem sẽ có mục tương ứng trong tập hợp dữ liệu bị ràng buộc dưới dạng DataContext. Và mỗi điều khiển trong ListBoxItem.ItemTemplate sẽ kế thừa DataContext. Để có được các đối tượng phía sau nút bấm bạn có thể làm như sau trong xử lý sự kiện click:

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

để có những thay đổi trong nguồn dữ liệu tự động cập nhật vào danh sách hộp, bạn có thể sử dụng một ObservableCollection.

1

Sử dụng ObservableCollection thấy các thay đổi tự động ngay lập tức

Lấy SelectedItem sử dụng DataContext

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

Bạn nên có một thuộc tính SelectedItem trong viewmodel của bạn được liên kết với selectedItem của listbox. Xóa mục cụ thể đó khỏi ObservableCollection của bạn. Hộp danh sách của bạn sẽ phản ánh các thay đổi.

1

Câu hỏi 2: Sử dụng ObservableCollection. Điều này thực hiện INotifyCollectionChanged để các mục sẽ được thêm vào và loại bỏ khi các thay đổi bộ sưu tập.

Câu hỏi 1: Truyền người gửi dưới dạng nút và sử dụng nó là DataContext. Đây sẽ là mục mà nó bị ràng buộc. Nếu bạn cũng cần phải có được ListBoxItem chính nó, bạn có thể bạn VisualTreeHelper.GetParent() để tìm kiếm cây.

Các vấn đề liên quan