WPF DataTemplate Trigger在不同的DataTemplate中设置属性

时间:2010-05-22 23:15:11

标签: wpf silverlight triggers datatemplate

我有2 DataTemplate s(A& B)。 A包含Expander,扩展程序的HeaderTemplate指向另一个DataTemplate(B)。

DataTemplate B如下所示:

    <DataTemplate x:Key="ProjectExpanderHeader">
        <Border CornerRadius="2,2,0,0" 
                Background="{StaticResource ItemGradient}"   
                HorizontalAlignment="{Binding HorizontalAlignment,
                                              RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}},
                                              Mode=OneWayToSource}">
            <local:ItemContentsUserControl Height="30"/>
        </Border>
    </DataTemplate>

当A CornerRadius的{​​{1}}属性设置为true时,是否可以设置B Border的{​​{1}}?

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以通过引入CornerRadius类型的新attched属性(例如Helper.CornerRadiusProperty)并将其附加到DataTemplate A中某处的ExpanderHeader的父级来实现。您可以使用触发器基于IsExpanded设置此属性。

在DataTemplate B中,使用FindAncestor将Border的CornerRadius绑定到该属性:

<Border CornerRadius="{Binding local:Helper.CornerRadius, 
          RelativeSource={RelativeSource FindAncestor, 
          AncestorType={x:Type ContentPresenter}} ...

上面的示例假定您已在DataTemplate A中的ContentPresenter上设置了Helper.CornerRadius属性。

答案 1 :(得分:1)

为什么不使用触发器?

<DataTemplate>
        <Border CornerRadius="2,2,0,0"
                Background="{StaticResource ItemGradient}"
                HorizontalAlignment="{Binding HorizontalAlignment,
                                          RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}},
                                          Mode=OneWayToSource}">

            <Border.Style>
                <Style>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding DataTemplateA.IsExpanded}"
                                     Value="True">
                            <Setter Property="Border.CornerRadius"
                                    Value="2,2,0,0" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
            <local:ItemContentsUserControl Height="30" />
        </Border>
    </DataTemplate>

答案 2 :(得分:1)

我找到了解决方案。我将以下代码添加到DataTemplateB的触发器中。它的作用是寻找一个祖先扩展器控件并将CornerRadius属性应用于它。

        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Expander}},Path=IsExpanded}" Value="false">
                <Setter TargetName="ProjectExpanderHeader" Property="CornerRadius" Value="2,2,2,2"/>
            </DataTrigger>
        </DataTemplate.Triggers>