如何根据ViewModel中的属性动态更改ControlTemplate?

3
我希望根据ViewModel的属性动态选择ControlTemplate。我该如何实现呢?
在View中有2个ControlTemplates和一个ViewModel的布尔属性。基于这个属性,我需要选择并在View中显示其中之一的ControlTemplate。
<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 IsTyping}" 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" IsChecked="{Binding IsTyping, Mode=TwoWay,    UpdateSourceTrigger=PropertyChanged}">Show Details</CheckBox>
    </Grid>

因此,基于IsTyping的值,我希望显示我的ControlTemplate。如果直接将元素绑定到控件模板上,它会起作用,但这不是我的要求。

2个回答

1
将数据触发器绑定到正确的DataContext,即与CheckBox绑定的相同。
<DataTrigger Binding="{Binding DataContext.IsTyping, RelativeSource={RelativeSource AncestorType=ContentControl}}" Value="True">
    <Setter Property="Template" Value="{StaticResource detailedErrorTemplate}"/>
</DataTrigger>

谢谢您的回复。它完美地运行着。 - Pravin

0

我觉得你可以做一些更简单的事情

你需要使用 ContentControlContentTemplateSelector 来实现你想要的效果。

ContentTemplateSelector 是一个自定义类,它会根据你的数据来切换模板。

这将给你一个参考:http://www.wpftutorial.net/datatemplates.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接