Frage

Ich mache einige Validierung auf der Datasource von TextBox, die innerhalb eines Expanders und haben herausgefunden, dass, sobald ein Validierungsfehler ausgelöst wurde, wenn ich den Expander zusammenbrechen, bleibt die rote Box, wo die TextBox gewesen wäre.

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

Ich habe versucht, diese Runde zu erhalten, indem die Sichtbarkeit der Fehler Vorlage an den Expander zu binden, aber ich denke, es ist etwas falsch mit der Bindung.

<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>

Ich glaube, ich habe falsch gelaufen mit meiner Bindung, kann mich jemand auf dem richtigen Weg zurücklegen bitte? Alternativ weiß jemand eine andere Lösung für die Errortemplate noch sichtbar auf dem Einsturz eines Expander zu sein?

War es hilfreich?

Lösung

Anstatt jede Bindung zu tun, Sie könnten einen AdornerDecorator platzieren um die Elemente innerhalb des Expanders. Sie sehen, wird die Validierungsfehler Vorlage auf der adorner Schicht platziert, dass so, wie es oben auf alles andere erscheint. Das ist letztlich das, was dein Problem ist. Auch wenn Ihr Textfeld nicht sichtbar ist, weil der Expander geschlossen ist, wird die Fehler Vorlage ist immer noch auf der adorner Schicht.

Ich glaube, Sie dies mit dem folgenden XAML beheben können:

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

Dies schafft eine adorner Schicht speziell für innerhalb des Expanders. Wenn der Expander geschlossen ist die AdornerDecorator wird auch versteckt und sollte so alles drauf.

Andere Tipps

Im allgemeinen Debug-Bindungen können durchgeführt werden:

  1. Das Festhalten von Haltepunkten in einem Konverter (falls Sie eine verwenden, was Sie sind)
  2. Überprüfen der Ausgabebereich in Visual Studio für alle Debug-Warnungen über ungültige Bindungen

In dem Code, den Sie geschrieben haben, ich glaube, es wird sein, da die Value-Eigenschaft auf Setter ist keine Abhängigkeitseigenschaft und kann daher nicht gebunden sein.

Ich werde eine Meinung zu diesem Thema haben und sehen, ob ich mit etwas hilfreicher kommen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top