2010-01-19 29 views
7

Tôi muốn số ContentTemplate thay đổi theo giá trị trong DataTrigger.
Và có, tôi đã xem xét sử dụng một số DataTemplateSelector, nhưng bây giờ tôi cần một số DataTrigger hoặc tốt hơn cho biết là MultiDataTrigger.Không thể đặt ContentTemplate qua DataTrigger

Hãy dành một cái nhìn tại các ứng dụng mẫu dưới đây, DataTemplate không thay đổi:

<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 

Trả lời

9

Dưới đây là một cái gì đó mà làm việc cho tôi:

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

Lưu ý rằng DataTemplate của tôi là một ContentControl khác, cho phép DataTemplate.Triggers của tôi hoạt động trên ContentTemplate của (lồng nhau) ContentControl.

+1

Nếu nó giúp ích: Bạn có thể có ngoại lệ trừ khi bạn thay đổi StaticResource thành DynamicResource. – DeeStackOverflow

15

Tôi biết OP không có người sử dụng cho câu trả lời này nữa nhưng tôi nghĩ rằng tôi muốn trả lời nó anyway trong trường hợp bất cứ ai khác đi kèm cùng với cùng một vấn đề

Vấn đề duy nhất với XAML trong câu hỏi là ContentTemplate được thiết lập một cách rõ ràng trên ContentControl và không có trong Style và điều này sẽ ghi đè Trigger. Đặt nó trong Style thay vì khắc phục sự cố

<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

Hữu ích, cảm ơn! – Shimmy

+0

Giúp tôi. Cảm ơn. – mydogisbox

Các vấn đề liên quan