【问题标题】:How to dynamically change a WPF control's template using a checkbox?如何使用复选框动态更改 WPF 控件的模板?
【发布时间】:2011-07-08 16:51:28
【问题描述】:

我有一个错误对话框(如下所示)。

我在 ContentControl 中显示 Report 对象,我已在其中定义了一个 Template simpleErrorTemplate

窗口上有一个CheckBox,我想用它来更改模板到/从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>

【问题讨论】:

    标签: c# wpf templates binding


    【解决方案1】:

    您可以在 ContentControl 样式中使用 DataTrigger,您可以在其中绑定到 ChkShowDetails CheckBoxIsChecked 属性

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

    【讨论】:

    • 谢谢,我试过了,好像不行,样式没更新
    • @chillitom:您是否将模板从 ContentControl 移至 Style 中的 Setter?
    • @chillitom:更新了我的答案。您应该能够复制/粘贴它并将其与您的代码进行比较以查看您缺少的内容
    • 谢谢,没有像您怀疑的那样从 ContentControl 中删除模板
    【解决方案2】:

    此解决方案适用于正在搜索模板交换的用户。 很简单希望对你有帮助。如有错误请指出。

    只需使用此代码更改复选框选中事件上的模板。

     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/

    【讨论】:

    • 还有 TryFindResource 如果资源不存在则返回 null 而不是抛出错误。
    猜你喜欢
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多