扩展时修改扩展器标头子项

时间:2014-02-06 21:07:08

标签: wpf triggers expander

我无法弄清楚如何在XAML中执行此操作。我想出了使用Expanded / Collapsed事件的变通方法,但他们感觉不对。

我有一个带有组的DataGrid,它们被模板化为扩展器。我在扩展器内部有一个按钮,默认情况下是隐藏的,只需在展开扩展器时显示。

<GroupStyle.ContainerStyle>
    <Style TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">                                        
                    <Expander IsExpanded="True">
                        <Expander.Header>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="Some Text"/>
                                <Button Name="MyButton" Visibility="Collapsed" Content="Add All"/>                                                    
                            </StackPanel>
                        </Expander.Header>
                        <Expander.Content>
                            <ItemsPresenter />
                        </Expander.Content>
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</GroupStyle.ContainerStyle>

所以基本上所讨论的代码就在中间:

<Expander IsExpanded="True">
    <Expander.Header>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Some Text"/>
            <Button Name="MyButton" Visibility="Collapsed" Content="Add All"/>                                                    
        </StackPanel>
    </Expander.Header>
    <Expander.Content>
        <ItemsPresenter />
    </Expander.Content>
</Expander>

当扩展器扩展时,我正在尝试将Button的Visibility设置为false。我尝试使用如下触发器:

<Expander.Style>
    <Style TargetType="Expander">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsExpanded, RelativeSource={RelativeSource Self}}" Value="False">
                <Setter TargetProperty="MyButton" Property="Visibility" Value="Visible" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Expander.Style>

,但编译器不接受它,因为它找不到MyButton(我猜是因为它在标题内)。关于如何让它发挥作用的任何想法?

1 个答案:

答案 0 :(得分:4)

你必须像这样ControlTemplate移动DataTrigger:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type GroupItem}">
            <Expander Name="Expander" IsExpanded="True">
                <Expander.Header>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="Some Text" />

                        <Button Name="MyButton"
                                Visibility="Collapsed"
                                Content="Add All" />
                    </StackPanel>
                </Expander.Header>

                <Expander.Content>
                    <ItemsPresenter />
                </Expander.Content>
            </Expander>

            <ControlTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=IsExpanded, ElementName=Expander}" Value="False">
                    <Setter TargetName="MyButton" Property="Visibility" Value="Visible" />
                </DataTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
 </Setter>

<强> Notes

  • 我明确设置了Expander的名称,因为构造RelativeSource={RelativeSource Self}指向控制自己,而GroupItem中没有属性IsExpanded

  • 在Setter中没有TargetProperty属性,但有 TargetName