2010-01-19 3 views
7

ContentTemplateDataTrigger의 값에 따라 달라 지길 원합니다.
네, 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

15

나는 영업 이익은 더 이상이 답변에 대한 사용이 없습니다 알고 있지만 나는 다른 같은 문제

와 함께 온다 나는 문제의 XAML 유일한 문제는 그 인 경우 누군가에 어쨌든 답을 줄 알았는데 ContentTemplate은 StyleControl이 아니라 ContentControl에서 명확하게 설정되며이 값은 Trigger를 재정의합니다. 스타일로 설정하면 문제가 해결됩니다.

<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

+0

나를 도왔습니다. 감사. – mydogisbox

관련 문제