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

0 votes
asked Oct 4, 2010 by guruc

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!!

2 Answers

0 votes
answered Oct 4, 2010 by blindmeis

the answer to your 2nd question: build a messageboxservice and just call it from your viewmodel. you can find mvvm messageboxservices in all wpf frameworks. look at cinch for example.

the undo redo thing, hmm its built in in wpf, so strg+z will work. but i dont know yet how to get it work with mvvm :)

0 votes
answered Oct 11, 2010 by guruc

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.

Welcome to Q&A, where you can ask questions and receive answers from other members of the community.
Website Online Counter

...