У меня есть шаблон для отображения красной границы и сообщения об ошибке вокруг элементов управления. Он работает (проверен на TextBoxes и ComboBoxes). Но на двух конкретных comboboxes они этого не делают.
Ну давайте посмотрим, что по-другому в VM:WPF: Validation.ErrorTemplate не отображается
- , поскольку у меня есть общее выполнение проверки в моем базовом классе, не отображается никаких изменений там
- такой же асинхронно загруженных данных, который хорошо работает с проверкой только с одна панель над
поэтому короче говоря, нет разницы в VM.
Вид полностью такой же, тот же стиль применяется, поэтому короче нет разницы там тоже.
Поэтому я добавил NotifyOnValidationError=True
к ValidatesOnDataErrors=True
уже там, и подписался на Validation.Error
... И уволил !!! Тем не менее шаблон все еще не отображается. У меня нет идей, пожалуйста, предложите мне все, что нужно проверить!
EDIT: дальнейшие исследования:
Я декомпилированы DataErrorValidationRule и перекомпилировать его как MyDataErrorValidationRule, чтобы соответствовать оригиналу настолько близко, насколько это возможно. Я удалил ValidatesOnDataErrors=True
и добавил мой ValidationRule для отладки. Он возвратил new ValidationResult(false, (object)str);
с строкой, содержащей правильное сообщение об ошибке дважды - один раз для установки свойства null, и один раз для принудительной проверки всего объекта. Шаблон еще не отображается.
Я также проверил Validation.GetErrorTemplate на контроле (во время первого обжига Validation.Error), и это было NOT NULL, так что это не DynamicResource
, что не удалось ни.
EDIT: рабочий пример:
<ItemsControl ItemsSource="{Binding QuestionAnswers}">
<ItemsControl.Resources>
<!-- ... -->
<DataTemplate DataType="{x:Type Model:QuestionAnswerModel}">
<StackPanel>
<!-- here is the combo box -->
<ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left"
Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}"
ItemsSource="{Binding Options.Source}"
DisplayMemberPath="ItemName" SelectedValuePath="ItemID"
SelectedValue="{Binding Options.SelectedID, ValidatesOnDataErrors=true}" />
</StackPanel>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
нерабочим пример:
<ComboBox Margin="8,4" Padding="8" MinWidth="120" HorizontalAlignment="Left"
Validation.ErrorTemplate="{DynamicResource DefaultValidationErrorTemplate}"
SelectedItem="{Binding Type.SelectedItem, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" Validation.Error="ComboBox_Error"
ItemsSource="{Binding Type.Source}"
DisplayMemberPath="Localized"
>
Они из же XAML файл, то ItemsControl, содержащий рабочий ComboBox находится в той же сетке, как нерабочий ComboBox.
Единственное отличие заключается в том связан SelectedItem или SelectedValue, но это не должно быть никаких подшипников на проверки ...
Вы можете загрузить рабочий пример для своей проблемы? – blindmeis
@blindmeis: пример загружен – TDaver
Вы можете проверить свои настройки во время исполнения с помощью Snoop? Validation.ErrorTemplate ValueSource должен быть стилем в вашем случае. Я не получаю ваш код работать, потому что я пропустил проверку и так далее. – blindmeis