Я использую типичный Стиль для отображения ошибок проверки как подсказки от 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>
Ошибка я вхожу в окно вывода:
Система. Windows. Ошибка данных: 17: не Может получить 'Объект []' значение (введите 'ValidationError') от' (Проверка. Ошибки)' (вводят 'ReadOnlyObservableCollection '1'). BindingExpression:Path = (0) [0].ErrorContent; DataItem ='ComboBox' (Имя ='ownerComboBox'); целевым элементом является 'Поле комбинированного списка' (Имя ='ownerComboBox'); целевым свойством является 'Подсказка' (введите 'Объект'), ArgumentOutOfRangeException:'System. ArgumentOutOfRangeException: Указанный аргумент был вне диапазона допустимых значений. Название параметра: индекс'
Странно это также пытается внести недопустимые изменения Базы данных, когда я закрываю окно, если я изменяю какие-либо значения ComboBox (Это также, когда ошибка привязки происходит)!!!
Не может вставить ПУСТОЙ УКАЗАТЕЛЬ значения в столбец 'EmpFirstName', таблица 'OITaskManager.dbo. Сотрудники; столбец не позволяет, аннулирует. ВСТАВЬТЕ сбои. Оператор был завершен.
Просто путем комментария стиля все работает отлично. Как я фиксирую это?
На всякий случай любому нужен он, одно из поля комбинированного списка' 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;
}
}
Попробуйте преобразователь для преобразования в многострочную строку, как описано здесь
Я видел код, который вы используете, размещенный в нескольких местах, но мне кажется странным, что
Path=(Validation.Errors)[0].ErrorContent}
не вызывает никаких тревог. Но я также новичок в WPF, и, возможно, есть какой-то секрет, как заставить это работать в каждом случае.
Вместо того, чтобы пытаться проиндексировать возможно пустую коллекцию с помощью индекса массива, добавьте преобразователь, который возвращает первую ошибку в списке.