views:

57

answers:

2

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

A: 

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 :)

blindmeis
@blindmeis - Yes I could get the MessageBox to display but reverting is seeming to be impossible using MVVM !!!
Guru Charan
well maybe you can code some behavior for the Textbox where you can bind your VM to? i'm at holiday atm so i have no ide to test this:) there are a lot of sample behaviors out there for other things. here is a behavoir i use often http://blindmeis.wordpress.com/2010/06/01/wpf-masked-textbox-behavior/
blindmeis
A: 

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.

Guru Charan