2010-03-01 9 views
9

Ho un TextBox associato a una proprietà di un oggetto che implementa IDataErrorInfo. Ho impostato il TextBox e funziona correttamente. Il problema è che li ho su TabControl e il modello di validazione non viene più visualizzato se cambio la scheda in un'altra e poi torno alla scheda iniziale (dove è TextBox). Sembra che sia convalidato (come il valore è corretto), ma in realtà non lo è.Problema con convalida WPF (IDataErrorInfo) e tabulazione

questo è l'oggetto IDataErrorInfo - di notare che un valore "corretto" è una stringa con una lunghezza di 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; 
     } 
    } 
} 

e questo è il 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> 

Tutte le idee su ciò che Sto sbagliando?

risposta

26

Gli elementi di tabulazione tendono a incasinare gli ornitologi (anche se non so perché, l'ho provato).

Posso riprodurre il problema.

Risolvilo avvolgendo il contenuto del TabItem con un AdornerDecorator.

Quindi:

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

     <AdornerDecorator> 

      <Grid> 
      .... 
      </Grid> 

     </AdornerDecorator> 

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

Questo è anche un problema con il contenuto di 'Expander', e si applica la stessa soluzione. –

+1

Un post sul blog correlato - [Errori di convalida WPF scompaiono all'interno di TabControl quando si passa a TabItems] (http://karlshifflett.wordpress.com/2008/02/19/wpf-validation-errors-disappear-inside-tabcontrol-when-switching- tabitems /) – akjoshi

+2

Non è una soluzione completa. La validazione iniziale funziona solo per il primo elemento della scheda selezionato, il resto non si convalida automaticamente quando in seguito si passa a essi. Ho scoperto che impostando manualmente il codice DataContext dietro a loro su OnLoad risolve anche questo problema, ma è brutto. Sto ancora cercando una soluzione ... – MoonStom

0

Ho avuto problemi con solo la prima scheda (concentrato) ottenuto stile e solo quello persisteva dopo il cambiamento. Questa è la soluzione ho finito con (senza 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> 

Sulla base di questo articolo: http://techqa.info/programming/question/1369643/wpf-error-styles-only-being-rendered-properly-on-visible-tab-of-a-tab-control

Problemi correlati