Настройка шаблона ошибки валидации из кода в WPF - PullRequest
9 голосов
/ 25 ноября 2010

В моем приложении 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, а затем я проверяю там, ошибкаШаблон применяется правильно.Но я не могу этого сделать из-за какой-то другой проблемы.

Поэтому мне нужно проверить содержимое TextBox в PreviewLostKeyboardFocus.Я проверяю 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 ]

20 голосов
/ 26 ноября 2010

Чтобы установить «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
5 голосов
/ 01 декабря 2010

Спасибо за замечательную ссылку, которую он предложил мне. Мой код работает несколько таким образом

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));
4 голосов
/ 25 ноября 2010
Validation.SetErrorTemplate(txtBox, this.FindResource("validationTemplate") as ControlTemplate);
1 голос
/ 25 ноября 2010

За ваш первый вопрос. Вы можете установить ErrorTemplate из кода позади, как.

    public MainWindow()
    {
        InitializeComponent();

        var template = this.FindResource("validationTemplate") as ControlTemplate;
        Validation.SetErrorTemplate(this.textBox1, template);
     }


Edit: На ваш второй вопрос. Пожалуйста, обратитесь к следующему образцу. sites.google.com / сайт / html5tutorials / ValidationErrorText.zip

...