Search code examples
wpfmvvmerror-handlinguser-input

How to display a MessageBox when wrong input is given and reverting the old value of TextBox using MVVM in WPF


I have been using WPF and its built in validation controls for quiet sometime. I was going through an excellent article in codeproject whose link is given below

http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

I am having a requirement from one of our clients which I have not been able to chieve using MVVM in WPF.

The problem is as follows :

There is a TextBox which accepts only numbers. When the user enters any value other than numbers I have to display an error to him. The error should

  1. highlight the TextBox, provide a ToolTip
  2. display an error in MessageBox
  3. revert the TextBox to its previous value

For example when the TextBox is loaded, it might have an initial value say 10 . Then the user enters some wrong value say "aa".

Now I have to display a MessageBox saying "Wrong value" and then revert the value back to 10.

There are lot of articles and ways to display error in WPF say by using ErrorTemplate and so on.

<Style TargetType="{x:Type TextBox}"> 
      <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
      <ControlTemplate> 
          <DockPanel LastChildFill="True"> 
              <TextBlock DockPanel.Dock="Right" 
                  Foreground="Orange" 
                  FontSize="12pt"> 
                  !!!!
          </TextBlock> 
           <Border BorderBrush="Green" BorderThickness="1"> 
               <AdornedElementPlaceholder /> 
           </Border> 
          </DockPanel> 
      </ControlTemplate> 
      </Setter.Value> 
 </Setter> 
 <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" 
          Value="{Binding RelativeSource={RelativeSource Self}, 
          Path=(Validation.Errors)[0].ErrorContent}"> 
      </Setter> 
      </Trigger> 
 </Style.Triggers> 
 </Style> 

But how do I revert the value and display a MessageBox. I know it can be displayed using an event in code-behind file but I dont want to write any logic in my code behind file. I want to achieve this functionality using MVVM

A sample illustration will be really helpful!!


Solution

  • Hey people finally I solved the problem. Its based on this StackOverFLow Solution

    The solution is very simple. I call the Validator on losing focus from TextBox. The validator return me a Validation Result.Based on the result I can take some action.
    I used attached behaviour for this. I have written a trigger which checks if Validation.HasError is true or not. If it is true, then it assigns some dummy value to my attached property. While assigning I will have TextBoxBase under my control. Using this I just call the Undo() function and it solves my problem.