Почему WPF Разрабатывает для показа ошибок проверки в работе ToolTip для TextBox, но сбоях для ComboBox?

Я использую типичный Стиль для отображения ошибок проверки как подсказки от 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;
    }
}
38
задан Mike B 14 February 2010 в 09:43
поделиться

2 ответа

Попробуйте преобразователь для преобразования в многострочную строку, как описано здесь

2
ответ дан 27 November 2019 в 03:06
поделиться

Я видел код, который вы используете, размещенный в нескольких местах, но мне кажется странным, что

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

не вызывает никаких тревог. Но я также новичок в WPF, и, возможно, есть какой-то секрет, как заставить это работать в каждом случае.

Вместо того, чтобы пытаться проиндексировать возможно пустую коллекцию с помощью индекса массива, добавьте преобразователь, который возвращает первую ошибку в списке.

1
ответ дан 27 November 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: