2010-02-14 10 views
30

Estoy usando un estilo típico para mostrar los errores de validación como información sobre herramientas de IErrorDataInfo para un cuadro de texto como se muestra a continuación y funciona bien.¿Por qué WPF Style muestra errores de validación en ToolTip para un TextBox pero falla para 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> 

Pero cuando trato de hacer lo mismo para un cuadro combinado como esto falla

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

El error que consigo en la ventana de salida es:

System.Windows.Data Error: 17: No se puede obtener el valor 'Item []' (escriba 'ValidationError') desde '(Validation.Errors)' (escriba 'ReadOnlyObservableCollection`1'). BindingExpression: Path = (0) [0] .ErrorContent; DataItem = 'ComboBox' (Name = 'ownerComboBox'); el elemento objetivo es 'ComboBox' (Name = 'ownerComboBox'); objetivo es propiedad 'sobre herramientas' ArgumentOutOfRangeException (tipo 'Objeto'): 'System.ArgumentOutOfRangeException: especificado argumento estaba fuera de la gama de values.Parameter nombre válido: Índice'

Por extraño que también intenta realizar cambios de base de datos no válidos cuando Cierro la ventana si cambio cualquier valor de ComboBox (¡Esto también es cuando ocurre el error de enlace)!

No se puede insertar el valor NULL en la columna 'EmpFirstName', tabla 'OITaskManager.dbo.Employees'; la columna no permite nulos. INSERT falla La declaración ha finalizado.

Simplemente comentando el estilo, todo funciona perfectamente. ¿Cómo puedo solucionar esto?

Por si acaso alguien lo necesita uno de xaml el cuadro combinado' sigue:

<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: (Que hacer planes para poner en práctica al mando después de poco tiempo, pero como este es mi primer proyecto WPF no me he vuelto completa MVVM todavía. estoy tratando de tomar las cosas en las picaduras de tamaño pequeño o mediano)

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

Bueno, ha sido una semana sin respuestas sobre una pregunta que había asumido que era algo tonto de mi parte. ¿Alguien tiene alguna sugerencia sobre dónde investigar o información adicional para que yo publique sobre mi problema? –

Respuesta

91

Su conseguir este error porque cuando validación determine que no hay problemas, la colección de errores regresa con artículos, y la siguiente lógica de unión falla:

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

que está accediendo a la colección de validación por una específica índice. Actualmente estoy trabajando en una sugerencia de DataTemplate para reemplazar este texto.

Me encanta que Microsoft haya enumerado esto en su ejemplo estándar de una plantilla de validación.actualización

así reemplazar el código anterior con el siguiente, y la lógica de unión sabrá cómo manejar la colección ValidationResult vacío:

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

(XAML siguiente se añadió como un comentario)

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

Agradezco su respuesta al respecto. desafortunadamente, tuve que tomarme un descanso en la codificación, así que pueden pasar algunas semanas antes de que pueda profundizar en esto. –

+1

¡Ningún problema! el solo hecho de tratar de responder a las preguntas sobre el desbordamiento de la pila empuja mi propio conocimiento sobre el tema;) –

+0

¡Gracias por esta corrección! Tuve el mismo problema y ahora los mensajes feos en la ventana de salida desaparecieron. – Slauma

2

Pruebe el convertidor para convertir a una cadena de múltiples líneas como se describe here

1

he visto el código que está utilizando ha escrito en varios lugares, pero me parece extraño que

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

no plantea ninguna bandera roja. Pero también soy nuevo en WPF y tal vez haya algún secreto para hacer que funcione en todos los casos.

En lugar de intentar indexar una colección posiblemente vacía con un índice de matriz, agregue un convertidor que devuelva el primer error en la lista.

Cuestiones relacionadas