2010-01-19 58 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

相關問題