Por que o estilo WPF para mostrar erros de validação no ToolTip funciona para um TextBox mas falha para um ComboBox?

Eu estou usando um estilo típico para exibir erros de validação como uma dica de ferramenta de IErrorDataInfo para uma checkbox de texto como mostrado abaixo e funciona bem.

       

Mas quando eu tento fazer a mesma coisa para um ComboBox como este, ele falha

         

O erro que recebo na janela de saída é:

Erro System.Windows.Data: 17: Não é possível obter o valor ‘Item []’ (digite ‘ValidationError’) de ‘(Validation.Errors)’ (digite ‘ReadOnlyObservableCollection`1’). BindingExpression: caminho = (0) [0] .ErrorContent; DataItem = ‘ComboBox’ (Name = ‘ownerComboBox’); elemento de destino é ‘ComboBox’ (Name = ‘ownerComboBox’); A propriedade target é ‘ToolTip’ (tipo ‘Object’) ArgumentOutOfRangeException: ‘System.ArgumentOutOfRangeException: O argumento especificado estava fora do intervalo de valores válidos.Parâmetro name: index’

Estranhamente, ele também tenta fazer alterações de database inválidas quando eu fechar a janela se eu alterar quaisquer valores de ComboBox (isto é também quando ocorre o erro de binding) !!!

Não é possível inserir o valor NULL na coluna ‘EmpFirstName’, tabela ‘OITaskManager.dbo.Employees’; coluna não permite nulos. INSERT falha. A instrução foi encerrada.

Simplesmente comentando o estilo, tudo funciona perfeitamente. Como faço para corrigir isso?

Apenas no caso de alguém precisar de um dos xaml comboBox ‘segue:

            

SelectionChanged: (Eu planejo implementar o comando em pouco tempo, mas como este é o meu primeiro projeto do WPF, eu ainda não fiz o MVVM completo. Estou tentando fazer coisas em pequenas e médias picadas)

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

Você está recebendo este erro porque, quando a validação descobre que não há problemas, a coleção Errors retorna sem itens e a seguinte lógica de binding falha:

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

você está acessando a coleção de validação por um índice específico. Atualmente estou trabalhando em uma sugestão DataTemplate para replace este texto.

Eu amo que a Microsoft listou isso em seu exemplo padrão de um modelo de validação.

atualize-o para replace o código acima pelo seguinte, e a lógica de binding saberá como manipular a coleção de validaçãoresult vazia:

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

(xaml seguinte foi adicionado como um comentário)

         

Experimente o conversor para converter em uma string de várias linhas, conforme descrito aqui

Eu vi o código que você está usando postado em vários lugares, mas parece estranho para mim

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

não levanta nenhuma bandeira vermelha. Mas também sou novo no WPF e talvez haja algum segredo para fazer esse trabalho em todos os casos.

Em vez de tentar indexar uma coleção possivelmente vazia com um índice de matriz, inclua um conversor que retorne o primeiro erro na lista.

Eu acho que esta é a melhor maneira:

 Path=(Validation.Errors)/ErrorContent 

/ é realmente igual a CurrentItem por @Nathan

No meu caso, CurrentItem é um não ir.