0 votes

WPF - Styles avec propriétés personnalisées

Je développe une application de vérification de numéro de document et j'ai écrit un comportement attaché à la boîte de texte pour vérifier le texte. Voici le code du comportement :

 public class CPFTextBehavior : Behavior<TextBox>
    {
        static readonly DependencyPropertyKey IsCPFPropertyKey =
            DependencyProperty.RegisterAttachedReadOnly("IsCPF", typeof(bool), typeof(CPFTextBehavior),
                new FrameworkPropertyMetadata(false));

        public static readonly DependencyProperty IsCPFProperty = IsCPFPropertyKey.DependencyProperty;

        public static bool GetIsCPF(TextBox tb)
        {
            return (bool)tb.GetValue(IsCPFProperty);
        }

        public bool IsCPF
        {
            get { return GetIsCPF(AssociatedObject); }
            private set { AssociatedObject.SetValue(IsCPFPropertyKey, value); }
        }

        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.TextChanged += LocusProject.Validacao.CPF_CNPJValidation.ValidateCPF;
            AssociatedObject.PreviewTextInput += LocusProject.Validacao.CPF_CNPJValidation.ValidateCPFMask;
            DataObject.AddPastingHandler(AssociatedObject, LocusProject.Validacao.CPF_CNPJValidation.PastingCPFMask);
            AssociatedObject.PreviewKeyDown += Interactivity.PreventInsertKey;

        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
            AssociatedObject.TextChanged -= LocusProject.Validacao.CPF_CNPJValidation.ValidateCPF;
            AssociatedObject.PreviewTextInput -= LocusProject.Validacao.CPF_CNPJValidation.ValidateCPFMask;
            DataObject.RemovePastingHandler(AssociatedObject, LocusProject.Validacao.CPF_CNPJValidation.PastingCPFMask);
            AssociatedObject.PreviewKeyDown -= Interactivity.PreventInsertKey;
        }
    }

Et voici ce que je fais sur mon ResourceDictionary :

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:i="clr-namespace:LocusProject">

<Style TargetType="{x:Type TextBox}" x:Key="TextFields">
    <Setter Property="BorderBrush" Value="DarkBlue"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Style.Triggers>
        <EventTrigger RoutedEvent="TextBox.GotFocus">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0000000" Value="White"/>
                            <SplineColorKeyFrame KeyTime="00:00:00.3500000" Value="LightBlue"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
        <EventTrigger RoutedEvent="TextBox.LostFocus">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                            <SplineColorKeyFrame KeyTime="00:00:00.0000000" Value="LightBlue"/>
                            <SplineColorKeyFrame KeyTime="00:00:00.3500000" Value="White"/>
                        </ColorAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Style.Triggers>
</Style>

<Style TargetType="{x:Type TextBox}" x:Key="CPFField" BasedOn="{StaticResource TextFields}">
            <Setter Property="i:CPFTextBehavior.IsCPF" Value="True" />
</Style>

Mais voilà. Il est écrit "Exception has been thrown by the target of invocation" et je n'arrive pas à le faire fonctionner.

Est-ce que je fais quelque chose de mal ? Merci d'avance.

0voto

Samuel Jack Points 14556

Vous essayez de définir la valeur de la propriété IsCPF, mais vous avez enregistré cette propriété en lecture seule.

Vous devez :

  1. Modifier l'enregistrement du bien :

    static readonly DependencyProperty IsCPFProperty =
        DependencyProperty.RegisterAttached("IsCPF", typeof(bool),  typeof(CPFTextBehavior), new FrameworkPropertyMetadata(false));
  2. Ajout d'une méthode SetIsCPF :

    public static bool SetIsCPF(TextBox tb, bool value)
    {
        tb.SetValue(IsCPFProperty, value);
    }

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