2011-03-04 12 views
5

मेरे पास एक त्रुटि संवाद है (नीचे सरलीकृत दिखाया गया है)।चेकबॉक्स का उपयोग करके एक WPF नियंत्रण के टेम्पलेट को गतिशील रूप से कैसे बदलें?

मैं एक ContentControl में रिपोर्ट वस्तु प्रदर्शित जो मैं एक खाकाsimpleErrorTemplate परिभाषित किया है करने के लिए।

खिड़की है कि मैं/से detailedErrorTemplate करने के लिए टेम्पलेट बदलने के लिए उपयोग करना चाहते हैं पर एक चेक बॉक्स नहीं है। इस लक्ष्य को हासिल करने का सबसे अच्छा तरीका क्या है?

<Window x:Class="Core.ErrorDialog" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Window.Resources> 

     <ControlTemplate x:Key="simpleErrorTemplate"> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="{Binding Message}" /> 
     </ControlTemplate> 

     <ControlTemplate x:Key="detailedErrorTemplate"> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="{Binding Message}" /> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="{Binding Details}" /> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="{Binding StackTrace}" /> 
     </ControlTemplate> 

    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" />   
      <RowDefinition Height="50" /> 
     </Grid.RowDefinitions> 

     <ContentControl Grid.Row="0" Template="{StaticResource simpleErrorTemplate}" DataContext="{Binding Report}"/> 

     <CheckBox Margin="10,0,0,0" Grid.Row="1" x:Name="ChkShowDetails">Show Details</CheckBox>    
    </Grid> 
</Window> 

उत्तर

9

आप ContentControl शैली में एक DataTrigger उपयोग कर सकते हैं जहां ChkShowDetails की IsChecked संपत्ति CheckBox

<ContentControl Grid.Row="0" DataContext="{Binding Report}"> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Setter Property="Template" 
        Value="{StaticResource simpleErrorTemplate}"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=ChkShowDetails, 
               Path=IsChecked}" 
          Value="True"> 
        <Setter Property="Template" 
          Value="{StaticResource detailedErrorTemplate}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

अद्यतन

पूरा Xaml उदाहरण के लिए बाध्य पेस्ट करें और यह कोशिश :)

<Window.Resources> 
    <ControlTemplate x:Key="simpleErrorTemplate"> 
     <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T1" /> 
    </ControlTemplate> 
    <ControlTemplate x:Key="detailedErrorTemplate"> 
     <StackPanel> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T2" /> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T3" /> 
      <TextBox Margin="10,10,10,5" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" Text="T4" /> 
     </StackPanel> 
    </ControlTemplate> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="50" /> 
    </Grid.RowDefinitions> 
    <ContentControl Grid.Row="0" DataContext="{Binding Report}"> 
     <ContentControl.Style> 
      <Style TargetType="ContentControl"> 
       <Setter Property="Template" 
         Value="{StaticResource simpleErrorTemplate}"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=ChkShowDetails, 
                Path=IsChecked}" 
           Value="True"> 
         <Setter Property="Template" 
           Value="{StaticResource detailedErrorTemplate}"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
    <CheckBox Margin="10,0,0,0" Grid.Row="1" x:Name="ChkShowDetails">Show Details</CheckBox> 
</Grid> 
+0

धन्यवाद, मैं इस एक यद्यपि कोशिश दे दिया है और यह काम करने के लिए नहीं लगता है, शैली अपडेट नहीं किया जाता – chillitom

+1

@chillitom: क्या आप टेम्पलेट को कंटेंट कंट्रोल से स्टाइल में सेटर में ले जाते हैं? –

+0

@chillitom: मेरा जवाब अपडेट किया गया। आपको बस कॉपी करने/पेस्ट करने में सक्षम होना चाहिए और यह देखने के लिए कि आप क्या खो रहे हैं, –

1

यह समाधान उन लोगों के लिए है जो टेम्पलेट स्वैप की खोज कर रहे हैं। यह आसान आशा है कि यह आपकी मदद करे। कृपया किसी भी गलती को इंगित करें।

चेकबॉक्स चेक किए गए ईवेंट पर टेम्पलेट को बदलने के लिए बस इस कोड का उपयोग करें।

private void checkBox1_Checked(object sender, RoutedEventArgs e) 
    { 
     DataTemplate Temp; 
     Temp = (DataTemplate)this.FindResource("TemplateYouHaveCreated"); 
     listView1.ItemTemplate = Temp; 
    } 

अधिक जानकारी के लिए इस लिंक का उल्लेख

http://developingfor.net/2009/01/09/dynamically-switch-wpf-datatemplate/

+0

पर संदेह करते हैं, तो टेम्पलेट को कंटेंट कंट्रोल से हटा नहीं दिया गया है, जो संसाधन के लिए शून्य वापस लौटाएगा एक त्रुटि फेंकने के बजाय मौजूद नहीं है। – Hugoagogo

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