2008-10-29 19 views
52

मैं एक लिस्टबॉक्स है, और मैं इसके लिए ItemTemplate निम्नलिखित है:WPF उत्प्रेरक

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

आप देख सकते हैं ContentControl दृश्यता की स्थापना की है ढह करने के लिए।

मैं एक ट्रिगर है कि दृश्यता "दर्शनीय"

जब ListItem चयन किया जाता है करने के लिए सेट किया जा करने का कारण बनता परिभाषित करने की जरूरत है, लेकिन मैं यह समझ नहीं कर सकते हैं।

कोई विचार?

अपडेट: बेशक मैं डेटा टेम्पलेट को डुप्लिकेट कर सकता हूं और किसी एक या दूसरे का उपयोग करने के लिए प्रश्न बॉक्स में ट्रिगर्स जोड़ सकता हूं, लेकिन मैं इस कोड को डुप्लिकेट करना रोकना चाहता हूं।

उत्तर

98

आप अपने ContentControl शैली दे सकते हैं एक ट्रिगर पर सक्रिय होता है अपने कंटेनर (ListBoxItem) का चयन किया जाता है जैसे कि:

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

वैकल्पिक रूप से, मैं तुम्हें स्वयं टेम्पलेट के लिए ट्रिगर जोड़ सकते हैं लगता है और नाम से नियंत्रण संदर्भ । मैं इस तकनीक को अच्छी तरह से स्मृति से यह भी लिखते हैं और यह काम करेंगे ग्रहण करने के लिए आपके पास पर्याप्त जानकारी नहीं है, लेकिन यह कुछ इस तरह है:

<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! आपको बहुत - बहुत धन्यवाद! मुझे यह मुद्दा नहीं था लेकिन FindAncestor ने मुझे एक बड़ा दर्द हल करने में मदद की जो मैं अपने सिर को 2 घंटे तक टक्कर लगी थी! फिर से धन्यवाद। जेसन –

+1

डिजाइनर सामग्री क्या है ??? मैं चयनित listboxitem की पृष्ठभूमि सेट करने का प्रयास कर रहा हूं (मैं एक इनलाइन डेटामैप्लेट का उपयोग करता हूं)। मैं चाहता हूं कि जब उपयोगकर्ता किसी आइटम का चयन करता है तो इसकी पृष्ठभूमि नीली नहीं होनी चाहिए, लेकिन उसी रंग को अचयनित होना चाहिए। – Shimmy

+0

बस यह जोड़ना चाहता था कि दूसरे उदाहरण में डेटा ट्रिगर बाइंडिंग ने मुझे एक बड़े तरीके से मदद की। धन्यवाद! – NigelTufnel

3

@Matt, धन्यवाद !!!

बस IsSelected == झूठी के लिए एक ट्रिगर जोड़ना था, और अब यह एक आकर्षण की तरह काम करता है!

<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

आपको "गलत" मामले के लिए एक अलग ट्रिगर नहीं होना चाहिए। यह ट्रिगर संग्रह के बाहर दृश्यता सेटर द्वारा संभाला जाता है। –

+0

अजीब, तो मुझे अभी भी कुछ गलत करना होगा – TimothyP

+8

बस लक्ष्य पर डिफ़ॉल्ट के रूप में एक मान निर्दिष्ट करें, और वैकल्पिक मान निर्दिष्ट करने के लिए ट्रिगर का उपयोग करें। –

संबंधित मुद्दे