2 votes

Impossible de lier un bloc de texte WPF à une propriété

Dans mon projet, j'ai un contrôle personnalisé qui est un expandeur. Le contenu du bouton qui permet d'étendre ou de réduire le contrôle doit changer en fonction de l'état. J'ai réussi à faire fonctionner la plupart des éléments, mais je n'arrive pas à lier le texte au contenu que j'utilise pour le bouton.

Voici mon code XAML de Generic.xaml :

<ControlTemplate x:Key="PndExpanderControlVertical" TargetType="{x:Type local:PndExpanderControl}">
    <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <dx:DXExpander x:Name="expander" Grid.Column="0" FlowDirection="LeftToRight" VerticalExpand="None" HorizontalExpand="FromLeftToRight" IsExpanded="True">
                <dxlc:GroupBox x:Name="group_box" Padding="0" Header="Header"/>
            </dx:DXExpander>

            <Button Grid.Column="1" Padding="1" x:Name="expand_button">
                <Button.Style>
                    <Style TargetType="Button">
                        <Style.Triggers>
                            <!-- Button-Style, expanded -->
                            <DataTrigger Binding="{Binding IsExpanded, ElementName=expander}" Value="True">
                                <Setter Property="Content" Value="↧ ↧"/>
                                <Setter Property="LayoutTransform">
                                    <Setter.Value>
                                        <RotateTransform Angle="90"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                            <!-- Button-Style, collapsed -->
                            <DataTrigger Binding="{Binding IsExpanded, ElementName=expander}" Value="False">
                                <Setter Property="Content">
                                    <Setter.Value>
                                        <TextBlock>
                                            <TextBlock Text="↥ "/>
                                            <TextBlock Text="{Binding Header, ElementName=group_box}"/>
                                            <TextBlock Text=" ↥"/>
                                        </TextBlock>
                                    </Setter.Value>
                                </Setter>
                                <Setter Property="LayoutTransform">
                                    <Setter.Value>
                                        <RotateTransform Angle="90"/>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>
            </Button>
        </Grid>
    </Border>
</ControlTemplate>

Comme vous pouvez le voir, j'utilise un bloc de texte imbriqué pour combiner l'en-tête de la group_box avec des flèches. Cependant, la liaison du bloc de texte central ne fonctionne pas.

Pour être honnête, je travaille avec WPF depuis un certain temps maintenant mais la liaison de données (à la bonne source) reste un mystère pour moi. La plupart du temps, j'arrive à la faire fonctionner d'une manière ou d'une autre, mais si elle échoue, je n'ai aucune idée de ce qu'il faut faire. J'ai cherché sur Google pendant plusieurs heures et j'ai essayé plusieurs choses, mais rien n'a fonctionné pour moi.

Toute aide est appréciée.

1voto

mm8 Points 85107

Vous pourriez vous lier à la Header de la Content de la Expander :

<TextBlock Text="↥ "/>
<TextBlock Text="{Binding Content.Header, ElementName=expander}"/>
<TextBlock Text=" ↥"/>

Vous ne pouvez pas utiliser un ElementName pour se lier directement à la GroupBox puisqu'il n'est pas dans la même portée de nom que l'élément Button .

Editar:

Ok, cela ne fonctionne que si l'expandeur est réduit par défaut.

Mais vous pourriez utiliser un x:Reference pour se lier à la GroupBox :

<TextBlock Text="↥ "/>
<TextBlock Text="{Binding Header, Source={x:Reference group_box}}"/>
<TextBlock Text=" ↥"/>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X