2008-10-29 33 views
52

Tôi có một hộp danh sách, và tôi đã ItemTemplate sau cho nó:WPF kích hoạt cho IsSelected trong một DataTemplate cho các hạng mục ListBox

<DataTemplate x:Key="ScenarioItemTemplate"> 
    <Border Margin="5,0,5,0" 
      Background="#FF3C3B3B" 
      BorderBrush="#FF797878" 
      BorderThickness="2" 
      CornerRadius="5"> 
     <DockPanel> 
      <DockPanel DockPanel.Dock="Top" 
         Margin="0,2,0,0"> 
       <Button HorizontalAlignment="Left" 
         DockPanel.Dock="Left" 
         FontWeight="Heavy" 
         Foreground="White" /> 
       <Label Content="{Binding Path=Name}" 
         DockPanel.Dock="Left" 
         FontWeight="Heavy" 
         Foreground="white" /> 
       <Label HorizontalAlignment="Right" 
         Background="#FF3C3B3B" 
         Content="X" 
         DockPanel.Dock="Left" 
         FontWeight="Heavy" 
         Foreground="White" /> 
      </DockPanel> 
      <ContentControl Name="designerContent" 
          Visibility="Collapsed" 
          MinHeight="100" 
          Margin="2,0,2,2" 
          Content="{Binding Path=DesignerInstance}" 
          Background="#FF999898"> 
      </ContentControl> 
     </DockPanel> 
    </Border> 
</DataTemplate> 

Như bạn có thể thấy ContentControl đã Tầm nhìn thiết lập để sụp đổ.

tôi cần phải xác định một kích hoạt gây ra Tầm nhìn được thiết lập để "Visible"

khi ListItem được chọn, nhưng tôi không thể hình dung nó ra.

Bất kỳ ý tưởng nào?

CẬP NHẬT: Tất nhiên tôi có thể chỉ cần sao chép DataTemplate và thêm trình kích hoạt vào ListBox được đề cập để sử dụng hoặc cái khác, nhưng tôi muốn ngăn trùng lặp mã này.

Trả lời

98

Bạn có thể tạo kiểu ContentControl của bạn như vậy mà một vụ cháy kích hoạt khi chuyển container (ListBoxItem) trở thành lựa chọn:

<ContentControl 
    x:Name="designerContent" 
    MinHeight="100" 
    Margin="2,0,2,2" 
    Content="{Binding Path=DesignerInstance}" 
    Background="#FF999898"> 
    <ContentControl.Style> 
     <Style TargetType="{x:Type ContentControl}"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      <Style.Triggers> 
       <DataTrigger 
         Binding="{Binding 
          RelativeSource={RelativeSource 
           Mode=FindAncestor, 
           AncestorType={x:Type ListBoxItem}}, 
           Path=IsSelected}" 
         Value="True"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

Ngoài ra, tôi nghĩ rằng bạn có thể thêm kích hoạt để mẫu thân và tham khảo sự kiểm soát theo tên . Tôi không biết kỹ thuật này đủ tốt để nhập nó từ bộ nhớ và giả sử nó sẽ hoạt động, nhưng nó giống như sau:

<DataTemplate x:Key="ScenarioItemTemplate"> 
    <DataTemplate.Triggers> 
     <DataTrigger 
       Binding="{Binding 
        RelativeSource={RelativeSource 
         Mode=FindAncestor, 
         AncestorType={x:Type ListBoxItem}}, 
         Path=IsSelected}" 
       Value="True"> 
      <Setter 
       TargetName="designerContent" 
       Property="Visibility" 
       Value="Visible"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 

    ... 
</DataTemplate> 
+1

Dude! Cảm ơn bạn rất nhiều! Tôi đã không gặp vấn đề này nhưng FindAncestor đã giúp tôi giải quyết một nỗi đau lớn mà tôi đã đập đầu tôi trong 2 giờ! Cảm ơn một lần nữa. Jason –

+1

Nhà thiết kế nội dung gì ??? Tôi đang cố gắng thiết lập nền của listboxitem đã chọn (tôi sử dụng một bảng dữ liệu nội tuyến). Tôi muốn, khi người dùng chọn một mục, nền của nó không được chuyển sang màu xanh nhưng phải có màu giống như không được chọn. – Shimmy

+0

Chỉ muốn thêm rằng các ràng buộc DataTrigger trong ví dụ thứ hai đã giúp tôi một cách lớn. Cảm ơn! – NigelTufnel

3

@Matt, Cảm ơn bạn !!!

Chỉ cần thêm một trình kích hoạt cho IsSelected == false, và giờ nó hoạt động như một sự quyến rũ!

<ContentControl.Style> 
<Style TargetType="{x:Type ContentControl}"> 
    <Setter Property="Visibility" Value="Collapsed"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True"> 
      <Setter Property="Visibility" Value="Visible"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="False"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

+2

Bạn không cần phải có trình kích hoạt riêng cho trường hợp "Sai". Nó được xử lý bởi Visibility Setter bên ngoài bộ sưu tập Triggers. –

+0

Rất tiếc, sau đó tôi vẫn phải làm điều gì đó sai – TimothyP

+8

Chỉ cần chỉ định một giá trị làm mặc định trên chính đích đó và sử dụng trình kích hoạt để chỉ định giá trị thay thế. –

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