2010-03-01 13 views
9

Ich habe eine TextBox gebunden an eine Eigenschaft eines Objekts, das IDataErrorInfo implementiert. Ich habe die Validation.ErrorTemplate der TextBox eingerichtet, und es funktioniert gut. Das Problem ist, dass ich diese auf einem TabControl habe, und die Validierungsvorlage zeigt nicht mehr an, wenn ich die Registerkarte zu einer anderen ändere und dann auf die anfängliche Registerkarte zurückkomme (wo die TextBox ist). Es sieht so aus, als wäre es validiert (wie der Wert ist korrekt), aber eigentlich ist es nicht.Problem mit WPF-Validierung (IDataErrorInfo) und Registerkarte Fokussierung

Dies ist IDataErrorInfo Objekt - beachten Sie, dass ein "richtiger" Wert ein String mit einer Länge von 2:

public class Presenter : IDataErrorInfo 
{ 
    public Presenter() 
    { 
     this.Property = String.Empty; 
    } 

    public string Property { get; set; } 

    public string Error { get { return null; } } 

    public string this[string columnName] 
    { 
     get 
     { 
      if (columnName == "Property") 
      { 
       if (this.Property.Length == 2) 
        return null; 
       else 
        return "Invalid property length!"; 
      } 
      else return null; 
     } 
    } 
} 

und das ist das XAML:

<TabControl > 
    <TabItem Header="tabItem1" Name="tabItem1" GotFocus="tabItem1_GotFocus"> 
     <Grid> 
      <TextBox Width="100" Height="20" x:Name="txtField"> 
       <TextBox.Style> 
        <Style TargetType="{x:Type TextBox}"> 
         <Setter Property="Validation.ErrorTemplate"> 
          <Setter.Value> 
          <ControlTemplate> 
           <Grid> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="16"/> 
            </Grid.ColumnDefinitions> 
            <AdornedElementPlaceholder Grid.Column="0"/> 
            <Image Source="bullets16.png" Grid.Column="1" ToolTip="{Binding CurrentItem.ErrorContent, Mode=OneWay}"> 
            </Image> 
           </Grid> 
          </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </TextBox.Style> 
       <TextBox.Text> 
        <Binding Path="Property" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True"> 
        </Binding> 
       </TextBox.Text> 
      </TextBox> 
     </Grid> 
    </TabItem> 
    <TabItem Header="tabItem2" Name="tabItem2" > 
     <Grid /> 
    </TabItem> 
</TabControl> 

Alle Ideen, was Ich mache falsch?

Antwort

26

Tab-Elemente neigen dazu, mit Adornos zu versauen (obwohl ich nicht weiß, warum, erlebte ich es).

Ich könnte Ihr Problem reproduzieren.

Lösen Sie es, indem Sie den Inhalt des TabItem mit einem AdornerDecorator umhüllen. So

:

<TabControl > 
    <TabItem Header="tabItem1" Name="tabItem1" GotFocus="tabItem1_GotFocus"> 

     <AdornerDecorator> 

      <Grid> 
      .... 
      </Grid> 

     </AdornerDecorator> 

    </TabItem> 
    ... 
</TabControl> 
+2

Dies ist auch ein Problem mit dem Inhalt des 'Expander', und die gleiche Lösung gilt. –

+1

Ein verwandter Blogpost - [WPF-Validierungsfehler verschwinden beim Wechseln von TabItems in TabControl] (http://karlshifflett.wordpress.com/2008/02/19/wpf-validation-errors-disappear-inside-tabcontrol-when- switching- tabitems /) – akjoshi

+2

Keine vollständige Lösung. Die anfängliche Validierung funktioniert nur für den ersten ausgewählten Tab-Eintrag, der Rest wird nicht automatisch validiert, wenn Sie später zu ihnen wechseln. Ich habe herausgefunden, dass das manuelle Setzen des DataContext in Code auf OnLoad dieses Problem ebenfalls löst, aber es ist hässlich. Ich suche immer noch nach einer Lösung ... – MoonStom

0

I Problem hatte mit nur ersten (fokussiert) Registerkarte bekam Stil und nur dieser beharrte nach dem Wechsel. Dies ist Lösung, die ich am Ende mit (ohne AdornerDecorator)

<Style TargetType="{x:Type FrameworkElement}" x:Key="ValidatingControl"> 
<Style.Triggers> 
    <MultiTrigger> 
     <MultiTrigger.Conditions> 
      <Condition Property="Validation.HasError" Value="True" /> 
      <Condition Property="IsVisible" Value="True" /> 
     </MultiTrigger.Conditions> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <DockPanel LastChildFill="True"> 
         <Border BorderBrush="Red" BorderThickness="1"> 
          <AdornedElementPlaceholder Name="controlWithError"/> 
         </Border> 
        </DockPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="ToolTip" 
     Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" /> 
    </MultiTrigger> 
</Style.Triggers> 

zu diesem Artikel Basierend: http://techqa.info/programming/question/1369643/wpf-error-styles-only-being-rendered-properly-on-visible-tab-of-a-tab-control

Verwandte Themen