Как динамически изменить ControlTemplate на основе свойства в ViewModel? - PullRequest
0 голосов
/ 10 января 2019

Я хочу динамически выбрать шаблон ControlTemplate, основанный на свойстве модели представления. Как мне этого добиться.

У меня есть 2 ControlTemplates в View и логическое свойство в ViewModel. Основываясь на этом свойстве, я должен выбрать и отобразить один из моих ControlTempale в представлении.

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

0 голосов
/ 10 января 2019

Я думаю, вы можете сделать что-то намного проще

Что вам нужно, чтобы использовать ContentControl's ContentTemplateSelector для достижения того, что вы хотите.

ContentTemplateSelector - это пользовательский класс, который будет переключать шаблон в зависимости от ваших данных.

Это даст вам идею: http://www.wpftutorial.net/datatemplates.html

0 голосов
/ 10 января 2019

Привязать триггер данных к правильному DataContext, то есть к тому же, с которым CheckBox связан:

<DataTrigger Binding="{Binding DataContext.IsTyping, RelativeSource={RelativeSource AncestorType=ContentControl}}" Value="True">
    <Setter Property="Template" Value="{StaticResource detailedErrorTemplate}"/>
</DataTrigger>
...