Триггер WPT DataTemplate устанавливает свойство в другом шаблоне данных. - PullRequest
0 голосов
/ 23 мая 2010

У меня есть 2 DataTemplate с (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>

Можно ли установить CornerRadius B's Border, когда свойство IsExpanded для A's Expander установлено в true?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 27 мая 2010

Почему бы не использовать триггеры?

<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>
1 голос
/ 27 мая 2010

Я нашел свое решение. Я добавил следующий код в триггеры 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>
1 голос
/ 23 мая 2010

Это можно сделать, введя новое свойство attched типа CornerRadius (например, Helper.CornerRadiusProperty) и прикрепив его к родительскому элементу вашего ExpanderHeader где-то в DataTemplate A. Это свойство устанавливается на основе IsExpanded с помощью триггера.

В вашем DataTemplate B вы связываете CornerRadius вашей Границы с этим свойством, используя FindAncestor:

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

В приведенном выше примере предполагается, что вы установили свойство Helper.CornerRadius для ContentPresenter в DataTemplate A.

...