2010-01-19 18 views
7

Quiero que el ContentTemplate varíe de acuerdo con el valor en el DataTrigger.
Y sí, consideré usar un DataTemplateSelector, pero ahora necesito un DataTrigger o mejor dicho un MultiDataTrigger.No se puede establecer ContentTemplate a través del DataTrigger

favor, eche un vistazo a la siguiente aplicación de ejemplo, el DataTemplate no cambia:

<Window x:Class="Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:src="clr-namespace:WpfApplication1"> 
    <StackPanel> 
     <CheckBox IsChecked="{Binding BoolProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:Window1}}}" Content="BoolProperty"/> 
     <ContentControl Content="{Binding BoolProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:Window1}}}"> 
      <ContentControl.ContentTemplate> 
       <DataTemplate> 
        <CheckBox IsChecked="{Binding BoolProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:Window1}}}" Content="Template 1"/> 
       </DataTemplate> 
      </ContentControl.ContentTemplate> 
      <ContentControl.Resources> 
       <DataTemplate x:Key="Template2"> 
        <CheckBox IsChecked="{Binding BoolProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:Window1}}}" Content="Template 2"/> 
       </DataTemplate> 
      </ContentControl.Resources> 
      <ContentControl.Style> 
       <Style TargetType="ContentControl"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding BoolProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:Window1}}}" Value="True"> 
          <Setter Property="ContentTemplate" Value="{StaticResource Template2}"/> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ContentControl.Style> 
     </ContentControl> 
     <Button Name="btnSwitch" Content="Switch"/> 
    </StackPanel> 
</Window> 

Partial Class Window1 
    Public Property BoolProperty() As Boolean 
     Get 
      Return GetValue(BoolPropertyProperty) 
     End Get 
     Set(ByVal value As Boolean) 
      SetValue(BoolPropertyProperty, value) 
     End Set 
    End Property 
    Public Shared ReadOnly BoolPropertyProperty As DependencyProperty = DependencyProperty.Register("BoolProperty", GetType(Boolean), GetType(Window1), New FrameworkPropertyMetadata(False)) 

    Private Sub btnSwitch_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnSwitch.Click 
     BoolProperty = Not BoolProperty 
    End Sub 
End Class 

Respuesta

9

Aquí hay algo que funciona para mí:

<ContentControl Content="{Binding SomeBool}"> 
    <ContentControl.Resources> 
    <DataTemplate x:Key="PinkTemplate"> 
     <TextBlock Text="{Binding}" Background="Pink" /> 
    </DataTemplate> 
    <DataTemplate x:Key="LimeTemplate"> 
     <TextBlock Text="{Binding}" Background="Lime" /> 
    </DataTemplate> 
    </ContentControl.Resources> 
    <ContentControl.ContentTemplate> 
    <DataTemplate> 
     <ContentControl Name="cc" 
         Content="{Binding}" 
         ContentTemplate="{StaticResource PinkTemplate}" /> 
     <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding}" Value="True"> 
      <Setter TargetName="cc" 
        Property="ContentTemplate" 
        Value="{StaticResource LimeTemplate}" /> 
     </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 

Tenga en cuenta que mi DataTemplate es otro ContentControl, que permite a mis DataTemplate.Triggers operar en el ContentTemplate de ese (anidado) ContentControl.

+1

Si ayuda alguna: Puede obtener una excepción a menos que cambie StaticResource a DynamicResource. – DeeStackOverflow

15

sé que el PO no tiene ningún uso para esta respuesta más, pero pensé que respondería de todos modos, en caso de que alguien más viene con el mismo problema

El único problema con el XAML en la cuestión es que el ContentTemplate se establece explicilty en ContentControl y no en el estilo y esto anula el disparador. Establecerlo en el Estilo en su lugar corrige el problema

<ContentControl Content="{Binding BoolProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:Window1}}}"> 
    <ContentControl.Resources> 
     <DataTemplate x:Key="Template2"> 
      <CheckBox IsChecked="{Binding BoolProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:Window1}}}" Content="Template 2"/> 
     </DataTemplate> 
    </ContentControl.Resources> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <CheckBox IsChecked="{Binding BoolProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:Window1}}}" Content="Template 1"/> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding BoolProperty, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type src:Window1}}}" Value="True"> 
        <Setter Property="ContentTemplate" Value="{StaticResource Template2}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 
+0

Útil, gracias! – Shimmy

+0

me ayudó también. Gracias. – mydogisbox

Cuestiones relacionadas