2017-09-07 2 views
0

J'écris une zone de texte UserControl qui changera de couleur lorsque le texte qui s'y trouve n'est pas un nombre valide.Le déclencheur sur la propriété UserControl a été remplacé par le code

Telle est la déclaration de classe:

public partial class ValidatedNumberBox : UserControl, INotifyPropertyChanged 
{ 
    public bool IsValid { get; set; } 
    public static readonly DependencyProperty IsValidProperty = DependencyProperty.RegisterAttached(
     nameof(IsValid), typeof(bool), typeof(ValidatedNumberBox), new PropertyMetadata(true)); 
    public ValidatedNumberBox() 
    { 
     InitializeComponent(); 
     IsValid = CheckValidity(); 
    } 

    private void PART_TextBox_OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
     IsValid = CheckValidity(); 
     OnPropertyChanged(nameof(IsValid)); 
     TextChanged?.Invoke(sender, e); 
    } 

    private bool CheckValidity() 
    { 
     return !PART_TextBox.Text.Any(char.IsLetter); 
    } 

    #region INotify 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 

} 

Le XAML est simplement une zone de texte:

<UserControl x:Class="fisWPF.Controls.ValidatedNumberBox" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d"> 
<Grid> 
    <TextBox Name="PART_TextBox" TextChanged="PART_TextBox_OnTextChanged" /> 
</Grid> 

Je suis en train d'avoir une frontière pour changer lorsque la propriété IsValid est false comme ceci:

<Style TargetType="{x:Type Controls:ValidatedNumberBox}"> 
     <Setter Property="BorderBrush" Value="Transparent"/> 
     <Setter Property="BorderThickness" Value="2"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Controls:ValidatedNumberBox}"> 
        <Border BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          Background="{TemplateBinding Background}" 
          Padding="{TemplateBinding Padding}" 
          SnapsToDevicePixels="True"> 
         <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" 
              Content="{TemplateBinding Content}" 
              ContentStringFormat="{TemplateBinding ContentStringFormat}" 
              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsValid" Value="False"> 
          <Setter Property="BorderBrush" Value="Red"/> 
          <Setter Property="BorderThickness" Value="20"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Si je change le déclencheur de False à True la bordure rouge apparaît sur le contrôle, et si je lie IsValid à, par exemple, la propriété IsChecked d'un CheckBox, cela fonctionne aussi. La seule chose qui ne changera pas la frontière est de changer la valeur du code derrière. Comme on peut le voir, j'ai essayé d'utiliser l'interface INorifyPropertyChanged comme la réponse à beaucoup de questions dans cette page. Cependant, la valeur de l'événement PropertyChanged est toujours nulle et rien ne se passe lorsque j'écris des lettres dans la zone de texte.

Répondre

1

IsValid est une propriété de dépendance qui est censé avoir une enveloppe CLR:

public partial class ValidatedNumberBox : UserControl 
{ 
    public static readonly DependencyProperty IsValidProperty = DependencyProperty.RegisterAttached(
     nameof(IsValid), typeof(bool), typeof(ValidatedNumberBox), new PropertyMetadata(true)); 

    // .NET property wrapper 
    public bool IsValid 
    { 
     get { return (bool)GetValue(IsValidProperty); } 
     set { SetValue(IsValidProperty, value); } 
    } 

    public ValidatedNumberBox() 
    { 
     InitializeComponent(); 
     IsValid = CheckValidity(); 
    } 

    private void PART_TextBox_OnTextChanged(object sender, TextChangedEventArgs e) 
    { 
     IsValid = CheckValidity(); 
     TextChanged?.Invoke(sender, e); 
    } 

    private bool CheckValidity() 
    { 
     return !PART_TextBox.Text.Any(char.IsLetter); 
    } 
} 

Vous ne devez pas implémenter l'interface INotifyPropertyChanged pour augmenter les notifications de modification des propriétés de dépendance.