validations validate error assist c# wpf validation data-binding styles

c# - validate - validations wpf



¿Por qué WPF Style muestra errores de validación en ToolTip para un TextBox pero falla para un ComboBox? (4)

Creo que esta es la mejor manera:

Path=(Validation.Errors)/ErrorContent

/ es en realidad igual a CurrentItem por @Nathan

En mi caso, CurrentItem es un no ir.

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.

<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 intento hacer lo mismo con un ComboBox como este, 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 recibo en la ventana de salida es:

System.Windows.Data Error: 17: No se puede obtener el valor ''Item []'' (tipo ''ValidationError'') desde ''(Validation.Errors)'' (escriba ''ReadOnlyObservableCollection`1''). BindingExpression: Path = (0) [0] .ErrorContent; DataItem = ''ComboBox'' (Name = ''ownerComboBox''); el elemento objetivo es ''ComboBox'' (Name = ''ownerComboBox''); target property es ''ToolTip'' (tipo ''Object'') ArgumentOutOfRangeException: ''System.ArgumentOutOfRangeException: argumento especificado fuera del rango de valores válidos. Nombre del parámetro: index''

Curiosamente, también intenta hacer cambios no válidos en la Base de Datos cuando cierro la ventana si cambio algún 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 instrucción se ha terminado.

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

En caso de que alguien lo necesite, uno de los siguientes comboBox ''xaml:

<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: (Tengo planeado implementar el comando antes de tiempo pero, como este es mi primer proyecto de WPF, aún no he completado el MVVM completo. Estoy tratando de tomar cosas en mordiscos de tamaño pequeñ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; } }


He visto el código que está utilizando publicado en varios lugares, pero me parece extraño que

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

no levanta 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.


Obtiene este error porque cuando la validación descubre que no hay problemas, la colección Errores vuelve sin elementos y falla la siguiente lógica de enlace:

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

está accediendo a la colección de validación por un índice específico. 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.

actualice, reemplace el código anterior por el siguiente y la lógica de enlace sabrá cómo manejar la colección validationresult vacía:

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

(Se agregó xaml como comentario)

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


Pruebe el convertidor para convertirlo en una cadena de varias líneas como se describe here