Условный ControlTemplate на основе свойства ViewModel - PullRequest
0 голосов
/ 21 октября 2018

Возможно ли "выбрать" другой шаблон элемента управления на основе свойства модели представления?

У меня есть следующий шаблон элемента управления пользователя:

<UserControl.Template>
    <ControlTemplate TargetType="UserControl">

        <RadioButton 
            GroupName="DisplayButtons" 
            Content="{TemplateBinding Content}"/>

    </ControlTemplate>
</UserControl.Template>

На основе логического значения вмодель представления, я хочу использовать RadioButton или Button.

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Можно использовать разные представления для каждого случая, но этот метод более полезен в случае сложных шаблонов.Для текущего случая проще всего использовать триггеры:

Метод 1

<UserControl x:Class="Myusercontrolnamespace.Views.Myusercontrol" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" "  
   mc:Ignorable = "d" Height="auto" Width="auto" >

    <UserControl.Resources>
      <DataTemplate x:Key="RadioButtontTemplate">
        <RadioButton/>
      </DataTemplate>

      <DataTemplate x:Key="ButtonTemplate">
     <Button/>
      </DataTemplate>
    </UserControl.Resources>

   <Grid>
    <ContentControl Content="{Binding }">
      <ContentControl.Style>
     <Style TargetType="{x:Type ContentControl}">
        <Setter Property="ContentTemplate" Value="{StaticResource RadioButtontTemplate}" />
        <Style.Triggers>
        <DataTrigger Binding="{Binding IsRadioButton}" Value="False">
            <Setter Property="ContentTemplate" Value="{StaticResource ButtonTemplate}" />
        </DataTrigger>
        </Style.Triggers>
      </Style>
    </ContentControl.Style>
     </ContentControl>
  </Grid>
</UserControl>

Метод 2

<UserControl x:Class="Myusercontrolnamespace.Views.Myusercontrol" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" "  
   mc:Ignorable = "d" Height="auto" Width="auto" >

    <UserControl.Resources>
      <DataTemplate x:Key="RadioButtontTemplate">
        <RadioButton/>
      </DataTemplate>

      <DataTemplate x:Key="ButtonTemplate">
     <Button/>
      </DataTemplate>
    </UserControl.Resources>

 <Grid>
    <DataTemplate x:Key="globalControlTemplate">
     <ContentControl Content="{Binding }">
         <ContentControl.Style>
             <Style TargetType="{x:Type ContentControl}">
                 <Setter Property="ContentTemplate" Value="{StaticResource RadioButtontTemplate}" />
                 <Style.Triggers>
                     <DataTrigger Binding="{Binding ConsumerType}" Value="Business">
                        <Setter Property="ContentTemplate" Value="{StaticResource ButtonTemplate}" />
                     </DataTrigger>
                 </Style.Triggers>
             </Style>
         </ContentControl.Style>
     </ContentControl>
   </DataTemplate> 

   <ContentControl Content="{Binding globalControlTemplate}" />
 </Grid>

</UserControl>

* 1013 Сердечно *

0 голосов
/ 22 октября 2018

Вы можете использовать Style с DataTrigger, который устанавливает свойство Template:

<UserControl>
    <UserControl.Style>
        <Style TargetType="UserControl">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="UserControl">
                        <Button Content="Button" />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ViewModelProperty}" Value="True">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="UserControl">
                                <RadioButton Content="RadioButton" />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </UserControl.Style>
</UserControl>
...