Laden...

Binding an DependencyProperty in Template Trigger

Erstellt von ByteDevil vor 3 Jahren Letzter Beitrag vor 3 Jahren 789 Views
ByteDevil Themenstarter:in
132 Beiträge seit 2013
vor 3 Jahren
Binding an DependencyProperty in Template Trigger

Hi,

Ich möchte einen neuen Button basteln, der ein paar mehr Anpassungsmöglichkeiten bietet als der Normale, ohne das man jedes mal ein neues Template machen muss. Daher habe ich den Button abgeleitet und möchte nun einen Impliziten Style mit einem Template machen. Hier habe ich das default-Template vom normalen Button genommen zwecks Übersichtlichkeit etwas beschnitten.

Ich habe eine neue DP eingebaut, die den Brush für den Foreground beinhaltet, wenn IsEnabled == false gesetzt wird.

ich habe hier mal ein Minimalbeispiel, welches mein Problem reproduziert:

MyButton Klasse:

public class MyButton : Button
    {
        public static readonly DependencyProperty DisabledForegroundProperty = DependencyProperty.Register(
            nameof(DisabledForeground), typeof(Brush), typeof(MyButton), new PropertyMetadata(Brushes.Gray));
        public Brush DisabledForeground
        {
            get => (Brush) GetValue(DisabledForegroundProperty);
            set => SetValue(DisabledForegroundProperty, value);
        }
    }

Style/Template:

<Style TargetType="{x:Type local:MyButton}">
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="Background" Value="#FFDDDDDD"/>
            <Setter Property="BorderBrush" Value="#FF707070"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="DisabledForeground" Value="Red"/>
            <Setter Property="Padding" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:MyButton}">
                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                            <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisabledForeground}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

Das funktioniert nicht. Die Schriftfarbe ist dann immer schwarz.

Ändere ich den Trigger zu:


<Trigger Property="IsEnabled" Value="false">
      <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisabledForeground}"/>
</Trigger>

...geht es, solange der Button Content tatsächlich nur ein String ist. Habe ich da dann zb sowas hier drin:

<local:MyButton x:Name="TestButton" IsEnabled="False">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="123"/>
                    <Rectangle Width="16" Fill="{Binding ElementName=TestButton, Path=Foreground}"/>
                </StackPanel>
            </local:MyButton>

... funktioniert es nicht, weil ich in dem Trigger den Foreground vom Button selbst ja nie ändere...

Ist etwas anderes im Button Content, was sich am Foreground Binden soll, wird es nicht gefärbt.

Hat jemand eine Ahnung warum

<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisabledForeground}"/>

...nicht funktioniert? Ersetze ich das Binding durch eine Konstante, geht es...in der Ausgabe sind keine Binding-Errors zu sehen.