2010-01-19 62 views
7

我希望ContentTemplate根据DataTrigger中的值而变化。
是的,我考虑使用DataTemplateSelector,但现在我需要一个DataTrigger或更好的说MultiDataTrigger无法通过DataTrigger设置ContentTemplate

请看看下面的示例应用程序,该DataTemplate不会改变:

<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 

回答

9

这里的东西为我的作品:

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

注意我的DataTemplate是另一个ContentControl,它允许我的DataTemplate.Triggers在ContentTemplate上运行(嵌套)ContentControl。

+1

如果它有帮助:除非将StaticResource更改为DynamicResource,否则可能会得到异常。 – DeeStackOverflow 2011-02-28 17:30:41

15

我知道OP有没有用这个答案了,但我想我反正回答这个问题的情况下,任何人以同样的问题

沿着其他带有XAML中的问题,唯一的问题是, ContentTemplate在ContentControl上设置为Explicilty,而不在Style中,这会覆盖触发器。将其设置为Style而不是修复问题

<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

有帮助,谢谢! – Shimmy 2010-12-18 18:16:44

+0

也帮助了我。谢谢。 – mydogisbox 2011-11-28 16:43:48

相关问题