How to dynamically change a WPF control's template using a checkbox?

混江龙づ霸主 提交于 2019-12-21 02:02:35

问题


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>

回答1:


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>



回答2:


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/



来源:https://stackoverflow.com/questions/5192055/how-to-dynamically-change-a-wpf-controls-template-using-a-checkbox

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!