11
votes

Modèle d'erreur WPF - Boîte rouge toujours visible sur l'effondrement d'un extenseur

Je fais une certaine validation sur la source de données de la zone de texte qui se trouve dans un extenseur et j'ai constaté qu'une fois qu'une erreur de validation a été déclenchée, si je réduit l'extension, la boîte rouge reste lorsque la zone de texte aurait été.

<local:NotVisibleConverter x:Key="NotVisibleConverter" />

<ControlTemplate x:Key="TextBoxErrorTemplate">
  <DockPanel>
    <Border BorderBrush="Red" BorderThickness="2" 
            Visibility="{Binding Path=IsExpanded, 
                                 Converter={StaticResource NotVisibleConverter}, 
                                 RelativeSource={RelativeSource AncestorType=Expander}}" >
      <AdornedElementPlaceholder Name="MyAdorner" />
    </Border>
  </DockPanel>
  <ControlTemplate.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, 
                                Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>


0 commentaires

3 Réponses :


25
votes

Plutôt que de faire une liaison, vous pouvez placer un adornerdecorator code> autour des éléments à l'intérieur de votre expandeur. Vous voyez, le modèle d'erreur de validation est placé sur la couche Adorner de cette façon, il apparaît sur tout le reste. C'est finalement quel est votre problème. Même si votre zone de texte n'est pas visible car l'extension est fermée, le modèle d'erreur est toujours sur la couche Adorner.

Je pense que vous pouvez résoudre ce problème avec le XAML suivant: P>

<Expander Header="Blah Blah Blah">
   <AdornerDecorator>
      <TextBox Name="TextBox"
               Validation.ErrorTemplate="{DynamicResource TextBoxErrorTemplate}"
               Text="{Binding Path=Blah,
                              UpdateSourceTrigger=PropertyChanged,
                              ValidatesOnDataErrors=True}" />
   </AdornerDecorator>
</Expander>


4 commentaires

@Dusty - belle réponse. Je vais essayer cela comme j'ai un problème similaire dans mon application. Le adornerdecorator affecte-t-il la mise en page? +1


L'AdornerDecorateur ne doit pas affecter la mise en page. C'est juste une enveloppe autour d'un enfant.


OK, il peut donc être considéré comme préservant la mise en page, mais en soulevant le rendu et l'interaction de son enfant à la couche Adorner? Je pensais qu'il n'y avait qu'une seule couche adoratrice, mais la façon dont vous avez formulé la réponse suggère qu'il constitue un nouveau calque.


@Trew Désolé, je ne voulais pas confondre. Non, il ne souleve pas l'enfant à la couche Adorner. Il crée efficacement une autre couche adoratrice. La nouvelle couche Adorner est utilisée pour les orneurs créés sur n'importe quoi dans l'arborescence visuelle sous l'adornerdecorator. Typiquement, oui, il n'y a qu'une seule couche adoratrice, créée sur la fenêtre. Je pense que le contrôleur par défaut de la classe de la fenêtre a un adornerdecorator. Pas de magie ici.



1
votes

En général, les liaisons de débogage peuvent être effectuées par:

  1. Collage des points d'arrêt dans un convertisseur (si vous utilisez un, ce que vous êtes)
  2. Vérification du volet de sortie dans Visual Studio pour les avertissements de débogage sur les liaisons non valides

    Dans le code que vous avez posté, je crois que cela va être parce que la valeur de valeur sur le setter n'est pas une propriété de dépendance et ne peut donc pas être liée à.

    Je vais penser à cela et voir si je peux trouver quelque chose de plus utile.


0 commentaires

1
votes

0 commentaires