2010-02-14 3 views
30

Sto utilizzando uno stile tipico per visualizzare gli errori di convalida come suggerimento da IErrorDataInfo per una casella di testo come mostrato di seguito e funziona correttamente.Perché WPF Style mostra errori di convalida in ToolTip per un TextBox ma non riesce per un ComboBox?

<Style TargetType="{x:Type TextBox}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
       Value="{Binding RelativeSource={RelativeSource Self}, 
      Path=(Validation.Errors)[0].ErrorContent}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

Ma quando provo a fare la stessa cosa per un ComboBox come questo non riesce

<Style TargetType="{x:Type ComboBox}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
       Value="{Binding RelativeSource={RelativeSource Self}, 
      Path=(Validation.Errors)[0].ErrorContent}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

L'errore che ottengo nella finestra di output è:

System.Windows.Data Errore: 17: impossibile ottenere il valore 'Articolo []' (digitare 'ValidationError') da '(Validation.Errors)' (digitare 'ReadOnlyObservableCollection`1'). BindingExpression: Path = (0) [0] .ErrorContent; DataItem = 'ComboBox' (Name = 'ownerComboBox'); l'elemento di destinazione è 'ComboBox' (Name = 'ownerComboBox'); indirizzare proprietà è 'ToolTip' (tipo 'Oggetto') ArgumentOutOfRangeException: 'System.ArgumentOutOfRangeException: specificato l'argomento era fuori del campo di nome valido values.Parameter: indice'

Stranamente tenta anche di apportare modifiche di database non valido quando Chiudo la finestra se cambio qualche valore di ComboBox (Questo è anche quando si verifica l'errore di associazione) !!!

Impossibile inserire il valore NULL nella colonna "EmpFirstName", tabella "OITaskManager.dbo.Employees"; la colonna non consente null. INSERT fallisce. La dichiarazione è stata chiusa.

Semplicemente commentando lo stile in modo perfetto. Come posso risolvere questo?

Solo nel caso qualcuno ha bisogno di uno dei XAML del comboBox' segue:

<ComboBox ItemsSource="{Binding Path=Employees}" 
        SelectedValuePath="EmpID"      
        SelectedValue="{Binding Path=SelectedIssue.Employee2.EmpID, 
        Mode=OneWay, ValidatesOnDataErrors=True}" 
        ItemTemplate="{StaticResource LastNameFirstComboBoxTemplate}" 
        Height="28" Name="ownerComboBox" Width="120" Margin="2" 
        SelectionChanged="ownerComboBox_SelectionChanged" /> 


<DataTemplate x:Key="LastNameFirstComboBoxTemplate"> 
    <TextBlock> 
     <TextBlock.Text> 
      <MultiBinding StringFormat="{}{1}, {0}" > 
        <Binding Path="EmpFirstName" /> 
        <Binding Path="EmpLastName" /> 
      </MultiBinding> 
     </TextBlock.Text> 
    </TextBlock> 
</DataTemplate> 

SelectionChanged: (Ho intenzione di implementare comandare in breve tempo, ma, in quanto questo è il mio primo progetto WPF io non sono andato pieno MVVM ancora. sto cercando di prendere le cose in morsi di piccole-medie dimensioni)

// This is done this way to maintain the DataContext Integrity 
// and avoid an error due to an Object being "Not New" in Linq-to-SQL 
private void ownerComboBox_SelectionChanged(object sender, 
              SelectionChangedEventArgs e) 
{ 
    Employee currentEmpl = ownerComboBox.SelectedItem as Employee; 
    if (currentEmpl != null && 
     currentEmpl != statusBoardViewModel.SelectedIssue.Employee2) 
    { 
     statusBoardViewModel.SelectedIssue.Employee2 = currentEmpl; 
    } 
} 
+0

Beh, è ​​stata una settimana senza risposte su una domanda che avevo assunto era qualcosa di stupido da parte mia. Qualcuno ha un suggerimento su dove cercare o per ulteriori informazioni da pubblicare sul mio problema? –

risposta

91

vostro ottenere questo errore perché quando si convalida rileva che non ci sono problemi, i rendimenti Errori di raccolta con articoli, e la seguente logica vincolante fallisce:

Path=(Validation.Errors)[0].ErrorContent}" 

si accede alla raccolta di convalida da una specifica indice. Attualmente sto lavorando a un suggerimento DataTemplate per sostituire questo testo.

Mi piace che Microsoft abbia elencato questo nel loro esempio standard di un modello di convalida.

aggiornamento quindi sostituire il codice precedente con il seguente, e la logica vincolante saprà come gestire la raccolta validationresult vuoto:

Path=(Validation.Errors).CurrentItem.ErrorContent}" 

(segue xaml stato aggiunto come commenti)

<ControlTemplate x:Key="ValidationErrorTemplate" TargetType="Control"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Foreground="Red" FontSize="24" Text="*" 
        ToolTip="{Binding .CurrentItem}"> 
     </TextBlock> 
     <AdornedElementPlaceholder> 
     </AdornedElementPlaceholder> 
    </StackPanel> 
</ControlTemplate> 
+0

Apprezzo la tua risposta su questo. sfortunatamente ho dovuto prendere un po 'di pausa sulla codifica, quindi potrebbero passare alcune settimane prima di approfondire la questione. –

+1

Nessun problema! il solo tentativo di rispondere alle domande sullo stack overflow spinge la mia conoscenza sull'argomento;) –

+0

Grazie per questa correzione! Ho avuto lo stesso problema e ora i brutti messaggi nella finestra di output sono scomparsi. – Slauma

2

Prova il convertitore per la conversione in una stringa su più righe come descritto here

1

Ho visto il codice che sta utilizzando postato in più luoghi, ma sembra strano che

Path=(Validation.Errors)[0].ErrorContent} 

non solleva bandiere rosse. Ma sono anche nuovo di WPF e forse c'è un segreto per farlo funzionare in ogni caso.

Anziché tentare di indicizzare una raccolta potenzialmente vuota con un indice di matrice, aggiungere un convertitore che restituisca il primo errore nell'elenco.