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

Gur*_*ruC 10 validation wpf 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>
Run Code Online (Sandbox Code Playgroud)

我的TextBox如下:

<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}">                                              
    <TextBox.Text>
        <Binding Path="TEXT1" ValidatesOnDataErrors="True" validatesOnExceptions="True">
         </Binding>
    </TextBox.Text>
</TextBox>
Run Code Online (Sandbox Code Playgroud)

现在,如果我的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
    }
Run Code Online (Sandbox Code Playgroud)

问题1:我想知道如何将错误模板添加到TextBox

问题2:我想知道如何从代码中设置控件模板的错误消息.例如,我想将默认错误消息"Invalid Input:"更改为"Invalid Input:请输入正确的输入".

我想在代码背后做上面提到的事情!!!!

编辑1:

问题是如何从Validation.HasError后面的代码设置为true,因为我没有使用任何Validator.(或者我应该从ValidationTemplate后面的代码设置应该应用什么?))

编辑2:

我正在进行XML绑定,所以我无法实现IDataErrorInfo !! 我想从代码背后实现这一点!! 有没有办法从代码后面设置Validation.HasError?

Fre*_*lad 21

要在代码中设置"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);
}
Run Code Online (Sandbox Code Playgroud)

取消设置您使用的值

Validation.ClearInvalid
Run Code Online (Sandbox Code Playgroud)


Gur*_*ruC 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));
Run Code Online (Sandbox Code Playgroud)