2008-10-29 26 views
52

Ben bir liste vardır ve bunun için ItemTemplate vardır:WPF Tetik

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

Daraltmış için ContentControl Görünürlük belirledi görebileceğiniz gibi.

I Görünürlük

öğesini seçildiğinde "görünür" olarak ayarlanmalıdır neden olan bir tetik tanımlar gerekir, ama anlamaya olamaz.

Herhangi bir fikrin var mı?

GÜNCELLEME: Tabii ki DataTemplate'i çoğaltabilir ve tetikleyicilerini söz konusu Liste Kutusuna, birini veya diğerini kullanmak için ekleyebilirim, ancak bu kodu çoğaltmaktan kaçınmak istiyorum.

Bunu konteyner (ListBoxItem) Seçilen olur bir tetikleyici harekete öyle ki senin ContentControl şekillendirebilirsiniz

cevap

98

: Alternatif

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

, sana şablonun kendisi için tetiği ekleyebilir düşünmek ve adıyla denetimi başvuru . Ben bellekten yazın ve bu ödeme şekli varsaymak yeterince bu tekniği bilmiyorum ama böyle bir şey:

<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

Dostum! Çok teşekkür ederim! Bu konuya sahip değildim ama FindAncestor, kafamı 2 saat boyunca becermeye başladığım büyük bir acıyı çözmeme yardımcı oldu! Tekrar teşekkürler. Jason –

+1

TasarımcıContent nedir ??? Seçili listeboxitem'in arka planını ayarlamaya çalışıyorum (inline veri sayfası kullanıyorum). Kullanıcı, bir öğeyi seçtiğinde, arka planın mavi olmamasının, ancak seçilmemiş olarak aynı renge sahip olması gerektiğini istiyorum. – Shimmy

+0

Sadece ikinci örnekte DataTrigger Binding'in büyük bir şekilde bana yardımcı olduğunu eklemek istedim. Teşekkürler! – NigelTufnel

3

@Matt, teşekkür ederiz !!!

Sadece IsSelected == false, için bir tetikleyici eklemek zorunda kaldı ve şimdi bir çekicilik gibi çalışıyor!

<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

"False" durumu için ayrı bir tetikleyiciniz olmamalıdır. Bu, Tetikleyicilerin koleksiyonunun dışındaki Görünürlük Belirleyici tarafından ele alınmıştır. –

+0

Garip, o zaman hala yanlış bir şey yapmalıyım – TimothyP

+8

Sadece bir değeri hedefin kendisinde varsayılan olarak belirtin ve alternatif değeri belirtmek için tetiği kullanın. –