Reputation: 2283
I want to give a different header to an Expander
when it is closed. When the value is constant, everything works well, but when I try to bind the header to a DP (e.g. Presenter
) in my control it doesn't work. Here is my simplified markup:
<UserControl x:Class="MyProject.Views.PlanDisplayer"
xmlns=...
xmlns:local="clr-namespace:MyProject.Views"
x:Name="This">
<Grid>
...
<Expander>
<Expander.Style>
<Style TargetType="Expander" BasedOn="{StaticResource ResourceKey=ChildExpanderStyle}">
<Setter Property="Header">
<Setter.Value>
<!--Works-->
<TextBlock Text="{Binding ElementName=This, Path=Presenter.Walls.Count, StringFormat='Walls: [{0}]'}"/>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsExpanded" Value="False">
<Setter Property="Header">
<Setter.Value>
<!--Doesn't work → Error: 4 : Cannot find source for binding-->
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=local:PlanDisplayer, Mode=FindAncestor}, Path=Presenter.Walls.Count, StringFormat='Walls [{0}]'}"/>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
</Expander.Style>
...
</Expander>
</Grid>
</UserControl>
Upvotes: 0
Views: 1626
Reputation: 169400
Try to use the same TextBlock
and apply a Style
to it:
<Style TargetType="Expander">
<Setter Property="Header">
<Setter.Value>
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="{Binding ElementName=This, Path=Presenter.Walls.Count, StringFormat='Walls: [{0}]'}}" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsExpanded, RelativeSource={RelativeSource AncestorType=Expander}}" Value="True">
<Setter Property="Text" Value="{Binding Path=Presenter.Walls.Count, StringFormat='Walls [{0}]'}, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Setter.Value>
</Setter>
</Style>
Upvotes: 1