Vinculando um gatilho de estilo do WPF a uma propriedade de dependência personalizada

9

Encontrei vários tópicos similares aqui, mas nenhum deles parece abordar meu problema específico.

Preciso destacar o plano de fundo de uma caixa de texto sob certas condições. Eu criei uma propriedade Highlight e tentei usar um gatilho em um estilo para defini-lo, mas ele nem sempre realça o texto.

Aqui está o meu estilo, simplificado:

<Style x:Key="TextBoxStyle" BasedOn="{StaticResource CommonStyles}">
    <Style.Triggers>
        <Trigger Property="Elements:DataElement.Highlight" Value="True">
            <Setter Property="Control.Background"
                    Value="{DynamicResource EntryBoxHighlightBackground}"/>
        </Trigger>
    </Style.Triggers>
</Style>

Os elementos são definidos como:

xmlns:Elements="clr-namespace:MDTCommon.Controls.Forms.Elements">

Então eu tenho a seção onde o estilo é aplicado:

<!-- Applies above style to all TextBoxes -->
<Style TargetType="TextBox" BasedOn="{StaticResource TextBoxContentHolder}" >
    <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
    <!-- Overrides the default Error Style -->
</Style>

No código por trás da classe DataElement, está o seguinte:

public static readonly DependencyProperty HighlightProperty = 
    DependencyProperty.Register("Highlight", typeof(bool), typeof(DataElement));

public bool Highlight
{
    get { return (bool)base.GetValue(HighlightProperty); }
    set { base.SetValue(HighlightProperty, value); }
}

Um DataElement é derivado do UserControl e contém uma referência ao objeto TextBox, bem como a outros objetos.

Na classe CustomForm que abriga todos os objetos DataElement, tenho o seguinte para definir a cor.

Resources["EntryBoxHighlightBackground"] = Brushes.Yellow;

Portanto, o primeiro problema é que a configuração da propriedade Highlight para o DataElement não faz com que o plano de fundo da caixa de texto seja desenhado em amarelo.

A outra questão é que percebo que estou aplicando esse estilo a todas as caixas de texto e posso ter caixas de texto em outras áreas que não estão realmente contidas em um DataElement, o que pode causar um problema de vinculação.

    
por WPFNewbie 01.08.2012 в 14:06
fonte

1 resposta

5

Tente converter seu gatilho em um DataTrigger e adicione uma ligação que será exibida diretamente no controle DataElement, da seguinte forma:

<DataTrigger Binding="{Binding Path=Highlight, RelativeSource={RelativeSource AncestorType={x:Type Elements:DataElement}}}" Value="True">
    <Setter Property="Control.Background" Value="{DynamicResource EntryBoxHighlightBackground}"/>
</DataTrigger>
    
por WPFNewbie Wannabe 02.08.2012 / 16:47
fonte