Я использую типичный стиль для отображения ошибок проверки в качестве всплывающей подсказки из IErrorDataInfo для текстового поля, как показано ниже, и он отлично работает.
<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>
Но когда я пытаюсь сделать то же самое для ComboBox, как это, он терпит неудачу
<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>
Ошибка, которую я получаю в окне вывода:
System.Windows.Data Ошибка: 17: Невозможно получить значение «Item []» (тип «ValidationError») из «(Validation.Errors)» (тип «ReadOnlyObservableCollection`1 '). BindingExpression: Путь = (0) [0] .ErrorContent; DataItem = 'ComboBox' (Name = 'ownerComboBox'); целевой элемент - «ComboBox» (Name = «ownerComboBox»); Свойство target - «ToolTip» (тип «Object»). ArgumentOutOfRangeException: «System.ArgumentOutOfRangeException: указанный аргумент находится вне диапазона допустимых значений. Имя параметра: index '
Как ни странно, он также пытается внести недопустимые изменения в базу данных, когда я закрываю окно, если я изменяю какие-либо значения ComboBox (это также происходит при возникновении ошибки привязки) !!!
Невозможно вставить значение NULL в столбец «EmpFirstName», таблица «OITaskManager.dbo.Employees»; столбец не допускает пустых значений. Вставить не удается.
Заявление было прекращено.
Просто, комментируя стиль, все работает идеально. Как мне это исправить?
На всякий случай, если кому-то это нужно, один из комбоБоксов: 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: (я планирую реализовать командование в ближайшее время, но, поскольку это мой первый проект WPF, я еще не полностью выполнил MVVM. Я пытаюсь взять вещи небольшими кусочками)
// 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;
}
}