从WPF中的代码设置验证错误模板

时间:2010-11-25 05:03:28

标签: wpf validation textbox code-behind controltemplate

我的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?

4 个答案:

答案 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