I have a datagrid with a template column, and in that template is a textbox. It’s bound to the ‘Quantity’ property of the object in the collection that makes up itemssource. Quantity is an integer. When I add an item to the datagrid, I am adding an event handler to the PropertyChanged event of the item:
EnteredPart.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(p_PropertyChanged);
This works fine when the user enters an integer in the textbox… the p_PropertyChanged handler fires and I can disable buttons and alter quantities as necessary. When the user enters a non-integer, the handler doesn’t get called, I just get a red outline around the textbox. Because of this, I can’t disable the necessary buttons when I need to (they should be disabled with the quantity is not legit.) Is there any way that I can do something about this?
EDIT: I tried changing the Quantity property to a string, and this caused the property changed handler to be called when non-integral values are entered. However, I then added validation to the textbox to check for this, and if the Validate method returns false, the property changed handler once again ceases to be hit. Is there any way at all to get both validation and property changed notifications??
EDIT 2: Here another instance of this problem I’m having, in another location. I have a form for adding/editing phone numbers. The phone number textbox looks like this:
<TextBox >
<TextBox.Text>
<Binding Path="Phone.Number">
<Binding.ValidationRules>
<local:PhoneValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Upon clicking a save button, I need to check in my viewmodel if the number is valid, because if it’s not, I don’t want to run the save command. However, it doesn’t seem as if there’s any way to do that, because if the validation fails, then the Phone.Number property has a null value, and I have no way to check to see if I should run the save command. I either need access to the error state (which I thought would work by Validation.GetErrors, but doesn’t), or to the actual text within the textbox, which isn’t available in the viewmodel.
Just for the record, validation in the View part has many drawbacks if you are in an MVVM architecture.
You’d try here to check your model’s content, in the view: you’d therefore break MVVM’s architecture by calling your model in the view.
Using
IDataErrorInfowill help you to fulfill MVVM’s main objective (ie. clearly separate the three parts).Just an example:
I think here you are just performing a very small validation (just check if it is an int or not).
But in a different environment, assume that your model is much more complicated and needs a deeper validation. Using
IDataErrorInfowill help you to check deeply in your model without calling it from the view.As a matter of fact, in my personal experience, as I regularly work with large and highly correlated datasets, I cannot even picture using validation without
IDataErrorInfobecause it’d cost me too much to investigate in all the data presented and find potential errors