我的WPF应用中有一个TextBox。我已经为验证错误定义了一个ControlTemplate,如下所示:
<ControlTemplate x:Key="validationTemplate">
<DockPanel LastChildFill="True">
<TextBlock DockPanel.Dock="Bottom" Text="Invalid Input: "></TextBlock>
<AdornedElementPlaceholder />
</DockPanel>
</ControlTemplate>
我的TextBox如下:
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}">
<TextBox.Text>
<Binding Path="TEXT1" ValidatesOnDataErrors="True" validatesOnExceptions="True">
</Binding>
</TextBox.Text>
</TextBox>
现在,如果我的TextBox添加了ValidationRule,然后我在那里验证,则错误模板正确应用。但由于其他一些问题,我无法做到这一点。
所以我必须在PreviewLostKeyboardFocus中验证TextBox的内容。我正在验证TextBox。现在我想在后面的代码中为TextBox设置错误模板,但我无法做到!!
我尝试了这个,但它没有像故意那样工作::
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:我想知道如何将错误模板添加到TextBox
问题2:我想知道如何从代码中设置控件模板的错误消息。例如,我想将默认错误消息“Invalid Input:”更改为“Invalid Input:请输入正确的输入”。
我想在代码背后做上面提到的事情!!!!
编辑1:
问题是如何从Validation.HasError后面的代码设置为true,因为我没有使用任何Validator。 (或者我应该从ValidationTemplate背后的代码设置应该应用什么?))
编辑2:
我正在进行XML绑定,所以我无法实现IDataErrorInfo !!我想从代码背后实现这一点!!有没有办法从代码后面设置Validation.HasError?
答案 0 :(得分:20)
要在代码中设置“Validation.HasError”,您可以使用Validation.MarkInvalid方法
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
答案 1 :(得分:5)
感谢他建议我的精彩链接。我的代码有点像这样
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));
答案 2 :(得分:4)
Validation.SetErrorTemplate(txtBox, this.FindResource("validationTemplate") as ControlTemplate);
答案 3 :(得分:1)
第一个问题。您可以从隐藏的代码设置ErrorTemplate,如。
public MainWindow()
{
InitializeComponent();
var template = this.FindResource("validationTemplate") as ControlTemplate;
Validation.SetErrorTemplate(this.textBox1, template);
}
修改强>
对于你的第二个问题。请参考以下示例。
sites.google.com/site/html5tutorials/ValidationErrorText.zip