2011-03-04 16 views
5

Tengo un cuadro de diálogo de error (se muestra simplificado a continuación).¿Cómo cambiar dinámicamente una plantilla de control WPF usando una casilla de verificación?

puedo mostrar la Informe objeto en un ContentControla la que he definido una plantilla simpleErrorTemplate.

hay una casilla en la ventana que me gustaría utilizar para cambiar la plantilla a/desde detailedErrorTemplate. ¿Cuál es la mejor manera de lograr esto?

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

Respuesta

9

Puede utilizar un DataTrigger en el estilo de ContentControl, donde se enlaza a la propiedad IsChecked de los ChkShowDetails 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> 

actualización

Ejemplo completo Xaml, pegar y probarlo :)

<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

gracias, le he dado una oportunidad, aunque y que no parece funcionar, el estilo no se actualiza – chillitom

+1

@chillitom: Did Mueves la Plantilla del ContentControl al Setter en el Estilo? –

+0

@chillitom: Actualizado mi respuesta. Deberías poder copiarlo y pegarlo y compararlo con tu código para ver lo que te falta –

1

Esta solución es para quienes están buscando el intercambio de plantillas. Es simple esperanza que te ayude. Por favor señale cualquier error.

Simplemente use este código para cambiar la Plantilla en el evento CheckBox Checked.

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

refieren este enlace para obtener más información

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

+0

También hay TryFindResource que devolverá nulo si el recurso no existe en lugar de arrojar un error. – Hugoagogo

Cuestiones relacionadas