Установка шаблона ошибки проверки из кода в WPF
У меня есть текстовое поле в моем приложении WPF. Я определил ControlTemplate для ошибки проверки следующим образом:
<ControlTemplate x:Key="validationTemplate">
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Bottom" Text="Invalid Input: "></TextBlock>
<AdornedElementPlaceholder />
</DockPanel>
</ControlTemplate>
Мое текстовое поле выглядит следующим образом:
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}">
<TextBox.Text>
<Binding Path="TEXT1" ValidatesOnDataErrors="True" validatesOnExceptions="True">
</Binding>
</TextBox.Text>
</TextBox>
Теперь, если мое текстовое поле добавлено ValidationRule, а затем я проверяю там, шаблон ошибки применяется правильно. Но я не могу этого сделать из-за какой-то другой проблемы.
Поэтому я должен проверить содержимое TextBox в PreviewLostKeyboardFocus. Я проверяю текстовое поле. Теперь я хочу установить шаблон ошибки для текстового поля в код позади, но я не в состоянии сделать это !!
Я пробовал это, но это не работает, как задумано::
private void blockTextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
TextBox txtBox = sender as TextBox;
txtBox.Template = this.FindResource("validationTemplate") as ControlTemplate;
//this behaves strange; it removes the TextBox and places the ErrorTemplate.
//I want it to behave like the way WPF does internally wherein it places
//the error template around TExtBox
}
Вопрос 1: я хочу знать, как добавить шаблон ошибки в текстовое поле
Вопрос 2: я хочу знать, как установить сообщение об ошибке шаблона элемента управления из кода. Например, я хочу изменить сообщение об ошибке по умолчанию "неверный ввод:" на "неверный ввод: пожалуйста, введите правильный ввод".
я хочу сделать вышеупомянутые вещи в коде позади только !!!!
Править 1:
Проблема заключается в том, как я устанавливаю из кода за проверкой.HasError как истина, потому что я не использую никакой валидатор. (или что я должен установить из кода за тем, что ValidationTemplate применяется ?? ))
Править 2:
Я делаю привязку XML, поэтому я не могу реализовать IDataErrorInfo !! Я хочу добиться этого только из-за кода!! Есть ли способ установить проверку.Есть ли у него за спиной какой-нибудь код ??
4 ответа:
Для установки " проверка.HasError " в коде позади вы можете использовать проверку.Метод маркинвалида
private void blockTextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) { TextBox txtBox = sender as TextBox; //... BindingExpression bindingExpression = BindingOperations.GetBindingExpression(txtBox, TextBox.TextProperty); BindingExpressionBase bindingExpressionBase = BindingOperations.GetBindingExpressionBase(txtBox, TextBox.TextProperty); ValidationError validationError = new ValidationError(new ExceptionValidationRule(), bindingExpression); Validation.MarkInvalid(bindingExpressionBase, validationError); }
Чтобы снять значение, которое вы используете
Validation.ClearInvalid
Спасибо за замечательную ссылку, которую он предложил me.My код идет примерно таким образом
String errorMessage = GetFormattedErrorMessage(toolTip.Range, range); ValidationError validationError = new ValidationError(new DummyValidator(), txtBox.GetBindingExpression(TextBox.TextProperty)); Validation.MarkInvalid(txtBox.GetBindingExpression(TextBox.TextProperty), validationError); validationError.ErrorContent = errorMessage; Validation.SetErrorTemplate(txtBox, GetErrorTemplate(errorMessage));
Для вашего первого вопроса. Вы можете установить ErrorTemplate из кода за like.
public MainWindow() { InitializeComponent(); var template = this.FindResource("validationTemplate") as ControlTemplate; Validation.SetErrorTemplate(this.textBox1, template); }
редактировать: Для вашего второго вопроса. Пожалуйста, обратитесь к следующему образцу. sites.google.com/site/html5tutorials/ValidationErrorText.zip