10

I have an error dialog (shown simplified below).

I display the Report object in a ContentControl to which I have defined a Template simpleErrorTemplate.

There is a CheckBox on the Window that I would like to use to change the template to/from detailedErrorTemplate. What is the best way to achieve this?

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

2 Answers 2

18

You can use a DataTrigger in the ContentControl Style where you bind to the IsChecked property of the 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>

Update

Complete Xaml example, paste it and try it :)

<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>
Sign up to request clarification or add additional context in comments.

5 Comments

thanks, I've given this a try though and it doesn't seem to work, the style is not updated
@chillitom: Did you move the Template from the ContentControl to the Setter in the Style?
@chillitom: Updated my answer. You should just be able to copy/paste that and compare it to your code to see what you're missing
thanks, hadn't removed the Template from the ContentControl as you suspected
Thank you, this helped me giving my custom UserControl 2 different display mode based on its Orientation!!! bow
0

This Solution is for those who are searching for Template swap. It is simple hope it helps you. Please point out any mistakes.

Just use this code for changing the Template on checkBox Checked Event.

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

refer this link for more information

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

1 Comment

There is also TryFindResource which will return null if the resource does not exist instead of throwing an error.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.